2016-02-27 67 views
2

我在看一个视频名为Becoming a C# Time Lord,在0点35分三十六秒这段代码弹出等待:双在一个呼叫

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

这是否意味着一个任务返回一个任务,因为我们有双等待?如果这种情况发生,如果我们有两次以上的等待时间会发生什么?这是好的做法,是否应该避免?

+0

请将代码改为* text *而不是图片。 –

回答

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; 

为什么你周围的这个性能有关目前尚不清楚 - 这是只有两个等待表达式,任何其他没有特别的不同方法有两个await表达式。

使用Task.WhenAny<TResult>(Task<TResult>[])这样做很自然,因为返回类型是Task<Task<TResult>>