方法: 単純な PLINQ クエリを作成して実行する

更新 : 2010 年 5 月

次の例では、単純な Parallel LINQ クエリをソース シーケンス上の AsParallel 拡張メソッドを使用して作成し、ForAll<TSource> メソッドを使用して実行する方法について示します。

メモメモ

ここでは、ラムダ式を使用して PLINQ でデリゲートを定義します。C# または Visual Basic のラムダ式についての情報が必要な場合は、「PLINQ および TPL のラムダ式」を参照してください。

使用例

Sub SimpleQuery()

    Dim source = Enumerable.Range(100, 20000)

    ' Result sequence might be out of order.
    Dim parallelQuery = From num In source.AsParallel()
                            Where num Mod 10 = 0
                            Select num

    ' Process result sequence in parallel
    parallelQuery.ForAll(Sub(e)
                             DoSomething(e)
                         End Sub)

    ' Or use For Each to merge results first
    ' as in this example, Where results must
    ' be serialized sequentially through static Console method.
    For Each n In parallelQuery
        Console.Write("{0} ", n)
    Next

    ' You can also use ToArray, ToList, etc
    ' as with LINQ to Objects.
    Dim parallelQuery2 = (From num In source.AsParallel()
                              Where num Mod 10 = 0
                              Select num).ToArray()

    'Method syntax is also supported
    Dim parallelQuery3 = source.AsParallel().Where(Function(n)
                                                       Return (n Mod 10) = 0
                                                   End Function).Select(Function(n)
                                                                            Return n

                                                                        End Function)

    For Each i As Integer In parallelQuery3
        Console.Write("{0} ", i)
    Next
    Console.ReadLine()

End Sub

' A toy function to demonstrate syntax. Typically you need a more
' computationally expensive method to see speedup over sequential queries.
Sub DoSomething(ByVal i As Integer)
    Console.Write("{0:###.## }", Math.Sqrt(i))
End Sub
            var source = Enumerable.Range(100, 20000);

            // Result sequence might be out of order.
            var parallelQuery = from num in source.AsParallel()
                                where num % 10 == 0
                                select num;

            // Process result sequence in parallel
            parallelQuery.ForAll((e) => DoSomething(e));

            // Or use foreach to merge results first.
            foreach (var n in parallelQuery)
            {
                Console.WriteLine(n);
            }

            // You can also use ToArray, ToList, etc
            // as with LINQ to Objects.
            var parallelQuery2 = (from num in source.AsParallel()
                                  where num % 10 == 0
                                  select num).ToArray();

            // Method syntax is also supported
            var parallelQuery3 = source.AsParallel().Where(n => n % 10 == 0).Select(n => n);

この例では、結果のシーケンスの順序が重要でない場合に Parallel LINQ クエリを作成および実行するための基本的なパターンを示しています。順序なしのクエリは一般的に、順序ありのクエリよりも実行速度が速くなります。 クエリにより、ソースがタスクにパーティション分割され、複数のスレッドで非同期的に実行されます。 各タスクが完了する順序は、パーティション内の要素を処理する作業量だけでなく、オペレーティング システムによる各スレッドのスケジュール方法などの外部的な要因にも依存します。 この例は使用法を示すことを目的としており、同等の LINQ to Objects 順次クエリよりも実行速度が遅い場合があります。 高速化の詳細については、「PLINQ での高速化について」を参照してください。 クエリの要素の順序を維持する方法の詳細については、「方法: PLINQ クエリの順序を制御する」を参照してください。

コードのコンパイル

  • コンソール アプリケーション プロジェクトの作成

  • コード例を Main メソッドの後に貼り付けます。

  • Main から SimpleQuery の呼び出しを追加し、F5 キーを押します。

参照

概念

Parallel LINQ (PLINQ)

履歴の変更

日付

履歴

理由

2010 年 5 月

使用法と高速化に関する説明を 追加。

カスタマー フィードバック