2

複数の非同期メソッドを並行して実行するために推奨される方法は何ですか?ActionBlock <T>対Task.WhenAll

in System.Threading.Tasks.Dataflow最大並列度を指定できますが、無制限はおそらくTask.WhenAllのデフォルトですか?

この:

var tasks = new List<Task>(); 
foreach(var item in items) 
{ 
    tasks.Add(myAsyncMethod(item)); 
} 
await Task.WhenAll(tasks.ToArray()); 

またはその:

var action = new ActionBlock<string>(myAsyncMethod, new ExecutionDataflowBlockOptions 
     { 
      MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded, 
      BoundedCapacity = DataflowBlockOptions.Unbounded, 
      MaxMessagesPerTask = DataflowBlockOptions.Unbounded 
     }); 
foreach (var item in items) { } 
{ 
    action.Post(item); 
} 
action.Complete(); 

await action.Completion; 
+0

'Parallel.ForEach()'? –

+1

並列と非同期はあまりよく混じらず、メソッドは非同期です(私はそれらを変更できません) –

+1

あなたが示した 'Task.WhenAll'コードは、並行してタスクを実行することとは何の関係もありません。例えば(おそらく)ホット 'タスク'を返す 'myAsyncMethod'の内部でスレッドプールスレッド、並列処理などが発生しています。 –

答えて

1

複数の非同期メソッドを並列に実行するために推奨される方法は何ですか?

サイドノート:実際にはない並列が、同時

in System.Threading.Tasks.Dataflow私たちは最大並列度を指定できますが、無制限はおそらくTask.WhenAllのデフォルトですか?

誰かがコメントしたように、Task.WhenAllは既存のタスクを結合するだけです。あなたのコードがTask.WhenAllになる頃には、すべての並行処理が既に行われています。

SemaphoreSlimなどを使用して、プレーンな非同期コードを抑制することができます。

非同期同時実行性を直接使用するかTPLデータフローを使用するかの決定は、周囲のコードに依存します。この並行操作が非同期に一度呼び出されるだけの場合、非同期同時実行が最善の策です。この並行操作がデータの「パイプライン」の一部である場合は、TPLデータフローがより適している可能性があります。

0

どちらの方法が許容可能であり、あなたはデータフローがあなたに、あなたが希望設定機能の多くを与える見ることができるように選択はあなたの条件によって支配されなければなりませんタスクを直接使用する場合は、手動で実装する必要があります。

どちらの場合でも、タスクプールはタスクのエンキューと実行を担当するため、同じ動作で同じことが繰り返されることに注意してください。

データフローは、構成可能な非同期操作のグループを連鎖させるのが得意ですが、タスクを使用すると、きめ細かな制御が可能になります。

+0

これは本当の利点としてそれを連鎖せずに並行処理のためだけだから? –

+0

連鎖や合成を必要としない場合、それは過度の可能性があります。 – Slugart

関連する問題