コレクションを並行して処理したいのですが、実装に問題があるので、助けが必要です。
並列ループのラムダ内で、C#でasyncとマークされたメソッドを呼び出す場合に問題が発生します。例えば:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
// some pre stuff
var response = await GetData(item);
bag.Add(response);
// some post stuff
}
var count = bag.Count;
作成されたすべてのスレッドは事実上単なるバックグラウンドスレッドであり、Parallel.ForEach
呼び出しは完了を待機しないため、問題はカウントが0で発生します。asyncキーワードを削除すると、メソッドは次のようになります。
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
// some pre stuff
var responseTask = await GetData(item);
responseTask.Wait();
var response = responseTask.Result;
bag.Add(response);
// some post stuff
}
var count = bag.Count;
それは機能しますが、待機待機時間を完全に無効にし、手動で例外処理を行う必要があります。(簡潔にするために削除されました)。
Parallel.ForEach
ラムダ内でawaitキーワードを使用するループを実装するにはどうすればよいですか?出来ますか?
Parallel.ForEachメソッドのプロトタイプはAction<T>
asパラメーターを取りますが、非同期ラムダを待機する必要があります。
await
からを削除するつもりだったと思いますawait GetData(item)
。