簡體   English   中英

如何使用Task.WaitAll等待兩個任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM