.NET4からLINQをお手軽にパラレル化することが出来ます。
たとえば以下のような配列があります。
var iar = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
これを列挙して、すべてをコンソールに出力するという場合に以前では
var iar = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var y = (from x in iar select x);
foreach (var i in y)
{
Console.WriteLine(i);
}
このような記述を行います。
リンクで列挙した(Ienumerable<int>)ものをListに変換(List<int>)して、ForEachで処理するという物です。
これをパラレル化するには、AsParallelというキーワードを追加します。
var iar = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var y = (from x in iar.AsParallel() select x);
foreach (var i in y)
{
Console.WriteLine(i);
}
もちろん列挙する時点で処理の並列化がされるので、出力順は保証されません。
出力順を保証するためには、AsOrderedというキーワードを追加します。
var iar = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var y = (from x in iar.AsParallel().AsOrdered() select x);
foreach (var i in y)
{
Console.WriteLine(i);
}
これにより処理の待ち合わせを自動で行ってくれるような物です。
ですから列挙処理などにおいては並列に処理しますが、それ以外の部分で並列化が行われないので、効率が悪くなります。
参照:PLINQ における順序維持
https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&checkda=1&ct=1272096358&rver=6.0.5276.0&wp=MCLBI&wlcxt=msdn$msdn$msdn&wreply=http://msdn.microsoft.com/ja-jp/library/dd460677.aspx&lc=1033&id=254354