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

时间:2016-04-06 02:23:25

标签: c# .net async-await undocumented-behavior

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

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:我是否需要输入&#34;订购标志&#34;在输出?将示例代码更改为以下内容:

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");
}
第二季度:(可能基于主要意见)根据无证件行为进行编码真是不好的做法,即使某些行为几乎没有可能被改变吗?有时您需要添加大量代码以避免无证件行为。

1 个答案:

答案 0 :(得分:10)

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

如果您查看实际返回结果的overload,您会看到:

  

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