ForAll
使用PLINQ能夠很方便地從平行作業將結果蒐集起來,變成單一序列輸出,如下圖所示。
這樣的結果表示,查詢過程是平行處理,但是在輸出的時候,會把結果merger回原本的主執行緒上。
public void Run()
{
var data = "abcdef".AsParallel().AsOrdered().Select(x => char.ToUpper(x));
var watch = new Stopwatch();
watch.Start();
foreach (var item in data)
{
this.DoSomething(item);
}
watch.Stop();
Console.WriteLine("Foreach Time: {0} ms", watch.ElapsedMilliseconds); // 3047ms
}
private void DoSomething(char c)
{
Thread.Sleep(500);
Console.WriteLine(c);
}
此程式範例說明,實際上輸出結果是交由主執行緒處理,所以每0.5秒會輸出一個字元,最後花3.047秒完成。
當結果不必在乎輸出順序時,而是純存執行某個動作,可以使用ForAll的方式,來加快輸出
使用ForAll,並不會將結果merger回原本的主執行緒上,而是會在各式的執行緒把作業完成。
public void Run()
{
var watch = new Stopwatch();
watch.Start();
"abcdef".AsParallel().AsOrdered().Select(x => char.ToUpper(x))
.ForAll(c => { this.DoSomething(c); });
watch.Stop();
Console.WriteLine("ForAll Consume Time: {0} ms", watch.ElapsedMilliseconds); //1023ms
}
private void DoSomething(char c)
{
Thread.Sleep(500);
Console.WriteLine(c);
}
每個執行緒各自完成工作,花費時間只要1.023秒,相對快很多。
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。