與C#5中的Task.Wait()
或Task.Result
,await
'Task
阻止執行等待的線程處於休止狀態。相反,使用await
關鍵字的方法需要爲async
,以便await
的調用只是使方法返回表示執行方法的新任務。如何創建一個始終產生的任務?
但當await
「編Task
完成async
方法已再次接收CPU時間之前,await
識別Task
作爲成品,因此async
方法將只在稍後的時間返回Task
對象。在某些情況下,這可能遲於可以接受的原因,因爲開發人員認爲的方法總是推遲在他的async
方法中的後續陳述。
誤async
方法的結構可以如下所示:
async Task doSthAsync()
{
var a = await getSthAsync();
// perform a long operation
}
然後有時doSthAsync()
僅將在很長一段時間後,退還Task
。
我知道它應該是這樣寫的:
async Task doSthAsync()
{
var a = await getSthAsync();
await Task.Run(() =>
{
// perform a long operation
};
}
...或者說:
async Task doSthAsync()
{
var a = await getSthAsync();
await Task.Yield();
// perform a long operation
}
但我不漂亮發現後面兩個模式,並要防止錯誤發生。我正在開發一個框架,它提供getSthAsync
,第一個結構應該是通用的。所以getSthAsync
應該返回一個Awaitable,它總是像Task.Yield()
返回的那樣返回YieldAwaitable
。通過任務並行庫像Task.WhenAll(IEnumerable<Task> tasks)
提供
不幸的是大多數功能只在Task
s運行所以getSthAsync
的結果應該是一個Task
。
那麼有可能返回一個總是會產生的Task
?
用法不成問題;問題是,它需要完成(在我看來)。 – ominug
或者只是'Task.Run(()=> {})'。這也應該起作用。 – usr
@usr true,只有它有一個競爭條件,因爲任務可能在完成IsCompleted之前完成。 – i3arnon