Является результатом выполнения задачи.Когда заказ гарантирован?


Из следующего теста мы видим, что текущая версия фреймворка гарантирует, что порядок вывода такой же, как и входные задачи.

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 4

1 ответ:

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

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

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