2016-04-06 13 views
4

次のテストから、フレームワークの現在のバージョンでは出力順序が入力タスクと同じであることが保証されています。Task.Whenの結果は保証されていますか?

the documentationsからしかし
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" 

私はそれを保証する文書化していないことを意味する、この動作については何も見つけることができません。 answers in this question

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:(ベース多分主な意見)は文書化されていない行動に応じて、コードにそれは本当に悪い習慣です、さらにいくつかの行動を変更することがほとんどない可能性がありますか?時々、文書化されていない振る舞いを避けるために、たくさんのコードを追加する必要があります。

答えて

9

間違った過負荷については、ドキュメントを参照してください。

あなたが実際に結果を返すoverloadを見れば、あなたが表示されます:

返されたタスクのTask<TResult>.Resultプロパティは、付属タスクの結果のすべてを含む配列に設定されます提供されたのと同じオーダー

関連する問題