2016-04-06 3 views
4

Из следующего теста мы видим, что текущая версия рамки гарантирует, что порядок вывода совпадает с задачами ввода.Является результатом Task.WhenВсе заказ гарантирован?

async Task<string> GetString1() 
{ 
    await Task.Delay(2000); 
    return "1"; 
} 

async Task<string> GetString2() 
{ 
    await Task.Delay(1000); 
    return "2"; 
} 

var results = await Task.WhenAll(GetString1(), GetString2()); 
//now we have results[0] == "1" results[1] == "2" 

Однако из the documentations я не могу найти ничего об этом поведении, а значит, не документирует гарантировано. Из мнений answers in this question

Q1: Нужно ли вводить «флаги заказа» на выходе? Измените пример код в следующий:

class OrderTaskResult<T> 
{ 
    public OrderTaskResult(int order, T value) 
    { 
     this.Order = order; 
     this.Value = value; 
    } 
    public int Order { get; private set; } 
    public T Value { get; private set; } 
} 

async Task<OrderTaskResult<string>> GetString1() 
{ 
    await Task.Delay(2000); 
    return new OrderTaskResult<string>(1, "1"); 
} 

Q2: (возможно первоначальное мнение основано) Является ли это действительно плохая практика коды в зависимости от недокументированного поведения, даже некоторые виды поведения имеет мало шансов быть изменены? Иногда вам нужно добавить много кодов, чтобы избежать недокументированных действий.

ответ

9

Вы смотрите на документацию о неправильной перегрузке.

Если вы посмотрите на overload, что на самом деле возвращает результаты, вы увидите:

Task<TResult>.Result свойство возвращенного задачи будет установлен на массив, содержащий все результаты поставляемых задач в том же порядке, в каком они были предоставлены

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