我有一個回傳任務的函式
class Sample
{
TaskCompletionSource<int> _tcs;
..
public Task<int> DoIt(){
StartDoingStuff();
return _tcs.Task;
}
..
private void FinshedStuffCallBack(){
_tsc.SetResult(42);
}
}
來電者去
var sample = new Sample();
var result = await Sample.DoIt();
作業正常
現在我需要在 DoIt 中做一些額外的事情,這本身就是等待的
我天真地嘗試過
public async Task<int> DoIt(){
await DoOtherAsyncStuff();
StartDoingStuff();
return _tcs.Task;
}
但這是不允許的
CS4016 由于這是一個異步方法,因此回傳運算式必須是“int”型別而不是“Task”型別
好的,我明白它想說什么,但這不是我的意圖,我還沒有回傳值,它會在 StartDoingStuff 觸發回呼時出現。
不知道接下來要嘗試什么。
uj5u.com熱心網友回復:
很可能你只需要(注意await最后一行):
public async Task<int> DoIt()
{
await DoOtherAsyncStuff();
StartDoingStuff();
return await _tcs.Task;
}
await最后一行需要是因為async回傳的函式Task<int>需要回傳int,而回傳的_tcs.Task是一個Task<int>。Usingawait將等待任務完成并回傳int我們需要的。
但是,根據您的完整代碼,您可能需要其他內容。例如,如果您正在做更復雜的事情,TaskCompletionSource您可能需要洗掉async此定義并執行類似的操作
public Task<int> DoIt()
{
return DoOtherAsyncStuff().ContinueWith(_ =>
{
StartDoingStuff();
return _tcs.Task;
}, TaskCompletionOptions.ExecuteSynchronously);
}
一般來說,最好不要弄亂 TaskCompletionSource ,除非您正在做一些更高級的事情,例如提供基于同步/回呼的異步抽象。因此,一個完整的代碼示例可能會改變我的答案(例如StartDoingStuff 的主體是DoOtherAsyncStuff什么?)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/408704.html
標籤:
上一篇:List<T>不可為空?
