マルチコアCPUを前提にして、システムに最適な分散数でタスクの並列処理をさせてみましょう。
var source = Enumerable.Range(0, 4); // マルチコア数にあった並列処理をする var list = source.AsParallel() .Select(n => { Debug.WriteLine("task{0} start", n); // NOTE:すごい時間のかかる処理をしているつもり new Task(() => { }).Wait(1000); Debug.WriteLine("task{0} end", n); return n; }) .ToList<int>(); Debug.WriteLine("tasks finished"); foreach(int n in list) { Debug.WriteLine(n); }
以下のように出力されます。
出力: task2 start task3 start task0 start task1 start task2 end task3 end task0 end task1 end tasks finished 0 3 1 2
処理結果の順番を強制して並列処理をおこなう
var source = Enumerable.Range(0, 4); // マルチコア数にあった並列処理をする var list = source.AsParallel() .AsOrdered() .Select(n => { Debug.WriteLine("task{0} start", n); // NOTE:すごい時間のかかる処理をしているつもり new Task(() => { }).Wait(1000); Debug.WriteLine("task{0} end", n); return n; }) .ToList<int>(); Debug.WriteLine("tasks finished"); foreach(int n in list) { Debug.WriteLine(n); }
以下のように出力されます。
出力: task3 start task2 start task0 start task1 start task3 end task1 end task0 end task2 end tasks finished 0 1 2 3