Dot-Net

等待任務:如果等待後沒有程式碼,則返回任務或等待[重複]

  • August 5, 2013

我做了一些閱讀,並認為我已經掌握了關於 System.Threading.Task 的 await 和 async 關鍵字的基礎知識。

但是,我不確定我是否正確解決了一個小問題,並且正在尋找驗證或有人糾正我。

我正在使用這個簽名實現一個非同步方法:

public Task ProcessUploadedFile(FileInfo info, string contentType);

顯然,如果我想在方法中等待任何東西,我需要將 async 關鍵字添加到簽名中,

我的問題是:如果我的方法做的最後一件事是呼叫另一個非同步方法,或者返回一個任務,那麼等待它有什麼意義嗎?

例如。

1:

public async Task ProcessUploadedFile(FileInfo info, string contentType)
{
 foreach (var something in someCollection)
   DoSomething();

 DoSomethingElse();

 await DoMethodAsync();
}

2:

public Task ProcessUploadedFile(FileInfo info, string contentType)
   {
     foreach (var something in someCollection)
       DoSomething();

     DoSomethingElse();

     return DoMethodAsync();
   }

我最初寫的是前者,但不再看到添加等待的意義。如果我寫後者,我完成了同樣的事情,如果他們選擇這兩種方法的呼叫者仍然可以使用 await 關鍵字,不是嗎?

以上有什麼不同嗎?哪個更好”?

await用於在等待完成時繼續執行方法體。如果沒有什麼可以繼續的,那麼你就不需要等待。

您可以將 await (簡化)視為ContinueWith操作。所以,你的第一種方法是這樣的:

foreach (var something in someCollection)
    DoSomething();

DoSomethingElse();

DoMethodAsync().ContinueWith(t => {});

有一篇很好的 MSDN 文章描述了非同步方法中發生的事情,它有很好的程式碼流程圖:

在此處輸入圖像描述

引用自:https://stackoverflow.com/questions/18061849