Является результатом выполнения задачи.Когда заказ гарантирован?
Из следующего теста мы видим, что текущая версия фреймворка гарантирует, что порядок вывода такой же, как и входные задачи.
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"
Однако из документации я не могу найти ничего об этом поведении, что означает, что это не документально гарантировано. Из мнений ответов на этот вопрос
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: (возможно, на основе первичного мнения) это так действительно плохая практика кодирования в зависимости от недокументированного поведения, даже некоторые виды поведения имеют мало возможностей для изменения? Иногда вам нужно добавить много кодов, чтобы избежать недокументированного поведения.
1 ответ:
Вы смотрите документацию на неправильную перегрузку.
Если вы посмотрите на перегрузку , которая фактически возвращает результаты, вы увидите:
Свойство
Task<TResult>.Result
возвращаемой задачи будет установлено в массив, содержащий все результаты поставленных задач в том же порядке, в котором они были предоставлены