2013-12-09 8 views
5

最近NDCロンドンでジョンスキートは約C#5の非同期/待つと「完了によって発注」非同期タスクのリストのアイデアを提示スポーク。リンクhttp://msmvps.com/blogs/jon_skeet/archive/2012/01/16/eduasync-part-19-ordering-by-completion-ahead-of-time.aspx非同期代表団とParallel.ForEach対OrderByCompletion(ジョンスキート)を使用する

私はちょっと混乱していますが、私はいつこのテクニックを使うのが適切かはわかりません。

スティーブンToubによって説明したように、私はこれと例えば以下

var bag = new ConcurrentBag<object>(); 
Parallel.ForEach(myCollection, async item => 
{ 
    // some pre stuff 
    var response = await GetData(item); 
    bag.Add(response); 
    // some post stuff 
} 

又はForEachAsyncの違いを理解することはできません - http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx

EDIT:からblog postを発見Stephen Toub「完了による注文」の説明< => "完了したタスクの処理"。読む価値があります。これを読んだ後、私はそれがどのように動作するのか、いつこの技術を使うのかを明確に理解することができました。

+0

'Parallel.ForEach'はすでにマルチスレッド用です。 –

答えて

15
  • asyncのコードを実行するParallel.ForEachを使用しないでください。 Parallel.ForEachasyncを理解していませんので、ラムダはasync voidになります。正しく動作しません(すべての作業が完了する前にParallel.ForEachが返されます;例外は正しく処理されません。あなたがオブジェクトのコレクション(ないTask複数可)を持っているときForEachAsync()よう

  • 使用何かが、あなたはそれらのそれぞれのためにいくつかのasyncアクションを実行したいとアクションを並列に実行する必要があります。

  • 使用OrderByCompletion()あなたがTaskのコレクションを持っているとき、あなたは、アクションはないを並列に実行する必要があり、各Taskの結果のためのいくつかのアクション(非同期かどうか)を実行したいとあなたがベースのアクションを実行したいですTaskが完了した順に表示されます。

+3

[ForEachAsync](http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx)メソッドは、Stephen Toubのブログに記録されています。 –

+0

@DanEsparzaええ、私はもうそれにリンクしていません。すでに質問にリンクしているからです。 – svick

2
Parallel.ForEach(myCollection, async item => 

これは、あなたが望むものをほぼ確実ではありません。デリゲートのタイプはAction<T>なので、匿名メソッドはasync voidメソッドです。それは、それが起動し、その副作用のいずれかをチェックすること以外の状態をチェックする方法がないことを意味します。特に、何かが間違っている場合、例外をキャッチして処理することはできません。

何も問題がなければ、結果はbagに追加されます。完了するまでは、bagは空になります。

対照的に、OrderByCompletionは、IEnumerable<Task<T>>を返します。すぐにには、未完了のすべてのタスクが含まれています。5番目の要素はawaitで、5つのタスクが完了すると続行できます。たとえば、多数のタスクを実行し、進行状況を示すために定期的にフォームを更新したい場合などに便利です。それは右のそれを行うだろう以外

あなたが与えた第三の選択肢、ForEachAsyncは、上記の問題もなく、ForEachように振る舞うでしょう。

+0

記事の後の 'ForEachAsync()'のバージョンを見ると、各タスクが完了してから次のタスクを開始するまで待機しません。 – svick

+0

@svickああ、ForEachAsyncには実装の詳細だけでなく、ユーザーが見ることのできる動作も異なる複数の異なる定義があります。ありがとう、私はそれに気付かなかった。 – hvd

関連する問題