C# 如何隐藏任务的任务?
考虑以下方法:C# 如何隐藏任务的任务?,c#,.net,async-await,task-parallel-library,task,C#,.net,Async Await,Task Parallel Library,Task,考虑以下方法: 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; } 另一方面,
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;
}
另一方面,如果我想要得到响应,我必须使用这个丑陋的await-await
来实现它:
public async Task<Response> GetAsync(string key)
{
return await await this.SendAsync("GET " + key);
}
公共异步任务GetAsync(字符串键)
{
return wait this.SendAsync(“GET”+键);
}
有没有更好的方法来处理这个问题,即从
SendAsync()
返回任务
,而不在类外公开任务
,同时不使用wait-wait
?我不确定为什么需要在异步方法内部使用TaskCompletionSource
。通常你要么做这件事,要么做那件事
但是如果您必须忘记返回TaskCompletionSource.Task
。只需像执行其他异步方法一样等待任务(WriteAsync
和FlushAsync
),然后将方法更改为返回task
:
public Task GetAsync(string key)
{
return this.SendAsync("GET " + key);
}
专用异步任务SendAsync(字符串数据)
{
this.Tcs=new TaskCompletionSource();
等待这个.Stream.WriteAsync(…);
等待此消息。Stream.FlushAsync();
返回等待this.Tcs.Task;
}
这样,异步方法返回一个任务,该任务在有
响应时完成,因此您只需等待SendAsync(“…”)
一次。由@i3arnon给出的答案是一个很好的解决方案,但另一个解决方案是使用展开
扩展方法
该方法用于将任务
转换为任务
,可按如下方式使用:
public Task<Response> GetAsync(string key)
{
return this.SendAsync("GET " + key).Unwrap();
}
公共任务GetAsync(字符串键)
{
返回此.SendAsync(“GET”+key).Unwrap();
}
任何结果、异常或取消都将正确传播到
sendsync
中的结果任务,而不是返回this.Tcs.Task代码>为什么不返回等待this.Tcs.Task
以获得干净的任务
返回类型?这确实是一种奇怪的异步
方法,但由于您询问了如何展开任务
,这正是展开
扩展方法(在系统.Threading.Tasks.TaskExtensions
中定义的方法)是的。我实际上没有这样做,因为我想按原样返回任务,而不必等待它完成。但我想对打电话的人来说,这不会有什么不同,对吧?@Gigi,没错。如果您的方法是异步的,那么在方法内部等待意味着调用者返回一个代表整个异步方法的任务。您不会同步阻止该方法。当您等待WriteAsync
时,任务将返回给调用者。
public Task<Response> GetAsync(string key)
{
return this.SendAsync("GET " + key).Unwrap();
}