How Task.WhenAll在引擎盖下工作



Task.WhenAll是如何工作的?它是否创建一个单独的线程,一旦所有的任务都收到关于finish的回调,线程就会完成。我有一个建议,在引擎盖下,它创建新的线程,并将工作传递给每个任务的系统驱动程序,并在最后等待它们,但不确定它是否正确?

不,Task.WhenAll不创建线程。传递给Task.WhenAll的一些元素任务可能已经创建了线程(但最佳情况下它们不会)。Task.WhenAll本身只是在元素任务上调用ContinueWith,传递一段检查其他任务状态的代码。没有"等待"。


下面是Task.WhenAll如何实现的一个例子。(不是微软代码)

Task MyWhenAll(IEnumerable<Task> tasks)
{
var a = tasks.ToArray();
var tcs = new TaskCompletionSource<bool>();
Array.ForEach(a, WatchTask);
return tcs.Task;
async void WatchTask(Task t)
{
try {
await t;
}
catch {}
if (a.All(element => element.IsCompleted)) {
if (a.Any(element => element.IsFaulted))
// omitted logic for adding each individual exception
// to the aggregate
tcs.TrySetException(new AggregateException());
else
tcs.TrySetResult(true);
}
}
}