2013-01-13 49 views
5

如果我有一個異步方法的身體像這樣 -獲得當前任務實例在異步方法體

public async Task GetSomething() { 

    await SendText("hi"); 
    await SendImage("bla.bmp"); 

} 

我怎樣才能獲得任務目標之前將其返回給用戶時

中的await踢

即..

public async Task GetSomething() { 

    myTasks.Add(Task.Current); 
    await SendText("hi"); 
    await SendImage("bla.bmp"); 

    //some processing 

} 

,這樣別的地方我可以做

await Task.WhenAll(myTasks); 
Console.WriteLine("All tasks complete"); 

這是這樣,我可以等所有任務關停

+0

「SendText」和「SendImage」的簽名是什麼? – oleksii

+0

它沒有區別。這只是一些虛擬代碼來顯示GetSomething執行多個子操作。如果它更清楚,用Thread.Sleep(50000)代替。 – NoPyGod

+0

是的。這些方法可以返回'void','Task'和'Task ',如果它是'Task'或'Task ',那麼你可以重構代碼。您可以獲取任務對象並將其添加到單個數組中。 – oleksii

回答

4

這是不能直接作爲語言不具有的設施來訪問「當前」任務之前完成。

儘管有一個解決方法:用另一種方法包裝異步方法。這個其他方法可以在異步方法返回時(大約在第一個等待點發生)獲得任務。

在所有情況下,我建議讓調用者將異步任務添加到列表中,而不是異步方法本身。即使從封裝的角度來看,這也很有用。

+0

看起來你是對的。我不知道這是否意味着我做錯了什麼,或者如果以前沒有想到過這樣的用例。我一直認爲跟蹤所有的異步方法會很常見。我想我將不得不通過將它包裝在一個內部函數中來醜化我的代碼。 – NoPyGod