Из следующего теста мы видим, что текущая версия рамки гарантирует, что порядок вывода совпадает с задачами ввода.Является результатом 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: (возможно первоначальное мнение основано) Является ли это действительно плохая практика коды в зависимости от недокументированного поведения, даже некоторые виды поведения имеет мало шансов быть изменены? Иногда вам нужно добавить много кодов, чтобы избежать недокументированных действий.