考慮以下方法:如何隱藏任務任務?
private async Task<Task<Response>> SendAsync(string data)
{
this.Tcs = new TaskCompletionSource<Response>();
await this.Stream.WriteAsync(...);
await this.Stream.FlushAsync();
return this.Tcs.Task;
}
我有一個異步方法,我希望返回Task<Response>
。但是因爲我想返回TaskCompletionSource<Response>
(其他地方設置,所以我不能在這裏等待),我不得不返回Task<Task<Response>>
。
在調用代碼中,我有兩種方法來處理它,同時從課堂外隱藏這個醜陋。假設反應並不重要,可以忽略不計,我可以簡單地返回一個Task
:
public Task GetAsync(string key)
{
return this.SendAsync("GET " + key);
}
在另一方面,如果我想回應,我都用這個醜陋await await
,使其工作:
public async Task<Response> GetAsync(string key)
{
return await await this.SendAsync("GET " + key);
}
是否有與此處理,即返回從SendAsync()
的Task<Response>
不暴露Task<Task<Response>>
類之外的一個更好的辦法,並在同一時間不使用await await
?
'SendAsync',而不是'return this.Tcs.Task;'爲什麼不'返回等待這個.Tcs.Task;'乾淨'任務'返回類型? –
quetzalcoatl
這確實是一個奇怪的'async'方法,但是因爲您詢問了解包'Task>',這正是'Unwrap'擴展方法(在System.Threading.Tasks.TaskExtensions中定義的)所做的。 –