Task.WhenAll订单的结果是否有保证?

Che*_*hen 4 .net c# undocumented-behavior async-await

从下面的测试我们可以看到框架的当前版本保证输出顺序与输入任务相同.

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"
Run Code Online (Sandbox Code Playgroud)

但是从文档中我找不到任何有关此行为的信息,这意味着它不是文档保证.从这个问题的答案的意见

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");
}
Run Code Online (Sandbox Code Playgroud)

Q2 :(可能基于主要意见)根据无证件行为进行编码真的是不好的做法,即使某些行为几乎没有可能被改变吗?有时您需要添加大量代码以避免未记录的行为.

SLa*_*aks 10

您正在查看错误过载的文档.

如果你查看实际返回结果的重载,你会看到:

Task<TResult>.Result返回任务的属性将设置为一个数组,其中包含所提供任务的所有结果,其顺序与提供的顺序相同