[英]How to use Task.WaitAll to wait both tasks
我有以下代碼,它調用2個異步方法並等待結果:
private Task FirstTaskAsync() {
...
}
private Task SecondTaskAsync() {
...
}
private async void Caller() {
await FirstTaskAsync();
await SecondTaskAsync();
}
問題在於它現在可以執行並按順序等待每個任務。 我想將其更改為Task.WaitAll()。 這是我的零錢:
private async void Caller() {
var first = FirstTaskAsync();
var second = SecondTaskAsync();
Task.WaitAll(first, second);
}
但是當我測試它時,Task.WaitAll()永遠不會返回。 你能告訴我缺少什么嗎?
首先,除非您正在執行事件處理程序(我懷疑您是這樣),否則永遠不要執行async void
,如果您執行了async Task
它將使您的問題更明顯。
private async Task Caller() {
await FirstTaskAsync();
await SecondTaskAsync();
}
//This still will not work...
private async Task Caller() {
var first = FirstTaskAsync();
var second = SecondTaskAsync();
Task.WaitAll(first, second);
}
Task.WaitAll
返回void,並且您從不在第二種方法中使用await
,因此您正在同步執行代碼並在SynchronizationContext
上進行阻塞, 這將導致您像看到的那樣獲得死鎖。
正確的解決方案不是阻塞,而是使用Task.WhenAll
,它返回一個Task本身,允許您刪除async關鍵字並僅返回結果
private Task Caller() {
var first = FirstTaskAsync();
var second = SecondTaskAsync();
return Task.WhenAll(first, second);
}
但是,如果Caller()
確實是一個事件處理程序,則還可以執行async void
並等待結果。
private async void Caller() { //This should only be done if this is a event handler.
var first = FirstTaskAsync();
var second = SecondTaskAsync();
await Task.WhenAll(first, second);
}
這對您有用嗎?
private async void Caller()
{
Task[] tasks = new Task[2];
tasks[0] = FirstTaskAsync();
tasks[1] = SecondTaskAsync();
await Task.WhenAll(tasks);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.