假設下面的方法被定義:我應該使用常規任務還是繼續任務?
Task<TResult> DoStuffAsync()
{
// ...
}
考慮下面的代碼(片斷1):
void MyFunction()
{
Task<TResult> task = DoStuffAsync();
task.ContinueWith(async() => {
TResult result = await task;
// do stuff with result
});
// poll `task` status...
}
相比於以下代碼(代碼段2):
void MyFunction()
{
Task<TResult> task = DoStuffAsync();
Task.Run(async() => {
TResult result = await task;
// do stuff with result
});
// poll `task` status...
}
(注意我怎麼不關心lambda函數的狀態(fire-and-forget)。但我做關心它是否是r 。aises任何例外)
兩個選項之間的第一差似乎很清楚:在(片斷1)在lambda代碼將僅開始執行DoStuffAsync()
完成之後,而在(片斷2)在所述代碼lambda將嘗試立即開始執行,並在DoStuffAsync()
完成時繼續。
但是,除了這種差異,您應該何時使用ContinueWith
以及何時應該使用Task.Run
?如果在DoStuffAsync()
或lambda函數中引發異常,會發生什麼情況?它會被吞噬還是每個潛在的異常都會被保證提升到可以處理的地方?
首先,您不應該在啓動它後查詢任務的狀態。這是一個很大的紅旗。 – Servy 2014-08-29 16:39:17
你爲什麼需要?只是做結果=等待DoStuffAsync();似乎是一個更好的選擇。 – ths 2014-08-29 16:40:14