2016-02-27 2 views
2

я смотрел видео под названием 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)); 
    } 

Означает ли это, что задача возвращает задачу и из-за того, что мы имеем double wait? Если это так, что происходит с производительностью, если у нас больше двух ожиданий? Это хорошая практика, если этого избежать?

+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>>.

Смежные вопросы