2013-08-05 126 views
15

我已經做了一些閱讀,並認爲我已經掌握了關於System.Threading.Task的await和異步關鍵字的基礎知識。正在等待的任務:返回任務,或等待如果沒有代碼後等待

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

我執行異步方法,與此簽名:

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關鍵字(如果他們選擇的話),否?

以上是否有區別?哪個更好」?

回答

16

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

您可以考慮等待(簡化)從ContinueWith作業。所以,你的第一個方法是這樣的:

foreach (var something in someCollection) 
    DoSomething(); 

DoSomethingElse(); 

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

有描述what happens in async method它有漂亮的代碼流程畫面漂亮的MSDN文章:

enter image description here

+1

大,這就是我的想法。謝謝! –

+1

等一下。我能澄清一些事嗎?在我的代碼的重寫版本中,您在Task.Factory.StartNew()中有DoSomething()和DoSomethingElse()...是嗎?我認爲這些位將與調用者在同一線程上同步運行?這將是DoMethodAsync()。ContinueWith(t => {} _); ? –

+1

@dark_perfect對不起,很匆忙。是的,你完全正確。更新代碼 –