2016-08-12 7 views
1

私は以下のコードを持っていますが、その時点でタスクを実行するのか、それとも同時にすべてを実行するのかは分かりません。それらのすべてが終わるために。一度に1つのタスクのリストを待つ

Dictionary<TemporaryAdditionalData, Exception> rejected = new Dictionary<TemporaryAdditionalData, Exception>(); 

    await Task.WhenAll(additionalData 
     .SelectMaybe(async adda => 
      await this.InsertTemporallyAdditionalData(
       guid, adda.Order, adda.ID, adda.Value, adda.IsMandatory 
      ), 
      out rejected 
     ).ToArray() 
    ); 

    return rejected; 

私はそれが自動的に例外をキャッチし、それらを返すLINQのSelectに拡張子だけだ、SelectMaybe方法はここでは関係ないと思います。

1)タスクは1つずつ、またはすべて同時に実行されますか?

2)どのような答えが1であっても、同じコードを書いてその逆を行うことはできますか?

+1

コードを実行して、自分が行っていることを見つけます。十分に簡単なテストです。 – Servy

+0

@Servy私は、特定の実装をテストするためのリソースを今すぐ持っていないので、私は同じロジックのより単純なバージョンを考え出す必要があるかもしれません。 –

+0

それはその動作をテストする最良の方法です、はい。 – Servy

答えて

3

タスクは並行して実行されます。それらを順番に実行したい場合は、次のような簡単なループを書くことができます:

foreach (var adda in additionalData) 
{   
    try 
    { 
     await this.InsertTemporallyAdditionalData(
      guid, adda.Order, adda.ID, adda.Value, adda.IsMandatory 
     ); 
    } 
    catch (Exception ex) 
    { 
     rejected[adda] = ex; 
    } 
} 
+0

残念ながらこれは機能しません。何らかの理由で、スレッド制限ごとに1つの非同期操作が行われるため、「以前の非同期操作が完了する前にこのコンテキストで開始された第2の操作」でEFが爆発することで確認できます。何か案は? – Marchy

関連する問題