次のテストから、現在のバージョンのフレームワークが、出力順序が入力タスクと同じであることを保証していることがわかります。
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"
ただし、ドキュメントから、この動作について何も見つけることができません。つまり、ドキュメントで保証されていません。この質問の回答の意見から:
出力に「注文フラグ」を入れる必要がありますか? たとえば、サンプル コードを次のように変更します。
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");
}