Task.WhenAll引擎蓋下是如何作業的?它是否創建單獨的執行緒,一旦所有任務都收到有關完成的回呼就完成了。我有一個建議,它在后臺創建新執行緒并將作業傳遞給每個任務的系統驅動程式并在最后等待它們,但不確定它是否正確?
uj5u.com熱心網友回復:
不,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);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/327284.html
上一篇:WPFDataGrid記憶體泄漏
下一篇:Microsoft.SqlServer.Management.Common.ServerConnection建構式不接受SqlConnection,但它應該
