2016-02-27 75 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>>