Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何隐藏任务的任务?_C#_.net_Async Await_Task Parallel Library_Task - Fatal编程技术网

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();
}