方法: 単純な 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 キーを押します。
参照
概念
履歴の変更
日付 |
履歴 |
理由 |
---|---|---|
2010 年 5 月 |
使用法と高速化に関する説明を 追加。 |
カスタマー フィードバック |