双人等待一次通话

时间:2016-02-27 10:33:03

标签: c# async-await

我正在观看一个名为Becoming a C# Time Lord的视频,在0:35:36这个代码弹出:

    async Task<TResult[]> PurelyWhenAll<TResult> (params Task<TResult>[] tasks)
    {
        var killJoy = new TaskCompletionSource<TResult[]>();

        foreach ( var task in tasks )
            task.ContinueWith(ant => 
            {
                if ( ant.IsCanceled )
                    killJoy.TrySetCanceled();
                else if ( ant.IsFaulted )
                    killJoy.TrySetException(ant.Exception.InnerException);
            });

        return await await Task.WhenAny(killJoy.Task, Task.WhenAll(tasks));
    }

这是否意味着任务返回任务,因此我们有双等待?如果我们有两个以上的等待,那么就性能会发生什么?这是一种好的做法,如果要避免这种做法吗?

2 个答案:

答案 0 :(得分:9)

Task.WhenAny将返回Task<Task<TResult>>

  • 等待Task.WhenAny()的结果将返回完成的第一个任务
  • 等待 任务将返回任务结果,即TResult[]

您可能会发现解释变量很容易理解:

var firstCompletedTask = await Task.WhenAny(killJoy.Task, Task.WhenAll(tasks));
var firstResult = await firstCompletedTask;
return firstResult;

不清楚为什么你关注这个的表现 - 它只是两个等待表达式,与使用两个等待表达式的任何其他方法没有特别的不同。

使用Task.WhenAny<TResult>(Task<TResult>[])时执行此操作非常自然,因为返回类型为Task<Task<TResult>>

答案 1 :(得分:0)

您不必担心两个等待执行同一任务的性能。如果已经完成,则只需返回值即可,而无需再次运行任务。