如果我不關心任務完成的順序,只需要它們全部完成,我還應該使用await Task.WhenAll
而不是多個await
? E.g,是DoWord2
低於首選方法DoWork1
(爲什麼?):爲什麼我應該更喜歡單個'等待Task.WhenAll'多個等待?
using System;
using System.Threading.Tasks;
namespace ConsoleApp
{
class Program
{
static async Task<string> DoTaskAsync(string name, int timeout)
{
var start = DateTime.Now;
Console.WriteLine("Enter {0}, {1}", name, timeout);
await Task.Delay(timeout);
Console.WriteLine("Exit {0}, {1}", name, (DateTime.Now - start).TotalMilliseconds);
return name;
}
static async Task DoWork1()
{
var t1 = DoTaskAsync("t1.1", 3000);
var t2 = DoTaskAsync("t1.2", 2000);
var t3 = DoTaskAsync("t1.3", 1000);
await t1; await t2; await t3;
Console.WriteLine("DoWork1 results: {0}", String.Join(", ", t1.Result, t2.Result, t3.Result));
}
static async Task DoWork2()
{
var t1 = DoTaskAsync("t2.1", 3000);
var t2 = DoTaskAsync("t2.2", 2000);
var t3 = DoTaskAsync("t2.3", 1000);
await Task.WhenAll(t1, t2, t3);
Console.WriteLine("DoWork2 results: {0}", String.Join(", ", t1.Result, t2.Result, t3.Result));
}
static void Main(string[] args)
{
Task.WhenAll(DoWork1(), DoWork2()).Wait();
}
}
}
如果您實際並不知道需要並行執行多少任務,該怎麼辦?如果你有1000個任務需要運行,該怎麼辦?第一個不會有太多的可讀性等待t1;等待t2; ....;等待tn' =>第二個總是在這兩種情況下最好的選擇 –
您的評論是有道理的。我只是想爲自己澄清一些事情,與我最近回答的另一個問題有關[http://stackoverflow.com/questions/18291299/how-to-wait-until-await-async-methods-finish/)。在那種情況下,有3個任務。 – avo