[英]Parallel vs Tasks in c#
我有一個方法,它需要進行多個服務調用並合並結果。 試圖使用Task這個並且結果不對,所以我做了以下兩個測試。
使用任務
List<Task<string>> tasks = new List<Task<string>>();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 20; i++)
{
tasks.Add(Task.Factory.StartNew(() =>
{
long started = stopwatch.ElapsedMilliseconds;
Random wait = new Random();
int waited = wait.Next(500, 3000);
Thread.Sleep(waited);
return string.Format("Index #{0} started at {1}ms and waited {2}ms", i, started, waited);
}));
}
Task.WaitAll(tasks.ToArray());
foreach (Task<string> task in tasks)
{
Console.WriteLine(string.Format("[Task {0,2}] {1}", task.Id, task.Result));
}
使用並行
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
int[] inputs = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
Parallel.ForEach(inputs, i =>
{
long started = stopwatch.ElapsedMilliseconds;
Random wait = new Random();
int waited = wait.Next(500, 3000);
Thread.Sleep(waited);
string result = string.Format("Task {0,2} started at {1} ms and waited {2} ms", i, started, waited);
Console.WriteLine(result);
});
stopwatch.Stop();
Console.WriteLine("Total time taken: " + stopwatch.ElapsedMilliseconds.ToString());
如下所示,任務索引始終打印為20(雖然傳遞了0到19)。 此外,Parallel比任務花費更多時間。 以下是結果,顯然我在任務中做錯了,無法弄清楚:(
任務輸出
[Task 1] Index #20 started at 0ms and waited 875ms
[Task 2] Index #20 started at 0ms and waited 875ms
[Task 3] Index #20 started at 0ms and waited 875ms
[Task 4] Index #20 started at 0ms and waited 875ms
[Task 5] Index #20 started at 0ms and waited 875ms
[Task 6] Index #20 started at 0ms and waited 875ms
[Task 7] Index #20 started at 855ms and waited 1477ms
[Task 8] Index #20 started at 886ms and waited 1965ms
[Task 9] Index #20 started at 886ms and waited 1965ms
並行輸出
Task 6 started at 1046 ms and waited 636 ms
Task 11 started at 1561 ms and waited 758 ms
Task 0 started at 16 ms and waited 2891 ms
Task 5 started at 16 ms and waited 2891 ms
Task 15 started at 17 ms and waited 2891 ms
Task 1 started at 17 ms and waited 2891 ms
Task 10 started at 17 ms and waited 2891 ms
使用實際方法我也有相同的經驗,其中最后一項被多次返回而不是單獨的結果。
如果你能引導我朝着正確的方向前進,那將會有很大的幫助。
注意:輸出是部分的。 實際產量各有20項。
當使用Tasks方法時,你在'i'上有一個閉包,這就是為什么所有的任務ID都是20(即在任務實際執行時,所有20個都已經被安排,因此i == 20,當方法執行時)。
你需要在i
上形成一個閉包。 這是最簡單的方法:
for (int x = 0; x < 20; x++)
{
var i = x;
tasks.Add(...) // keep using `i` inside here & never `x`
}
那應該解決它。
Parallel主要用於擴展算法以使用計算機上的可用CPU資源。 如果問題不是CPU綁定(即調用WebServices)並行不是正確的抽象。
所以在你的情況下,似乎任務是正確的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.