[解決済み】非同期ラムダによる並列foreach
2022-04-07 20:17:23
質問
コレクションを並列に処理したいのですが、実装がうまくいかないので、ご教授願います。
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;
カウントが0になると問題が発生します。なぜなら、作成されたスレッドはすべて事実上単なるバックグラウンドスレッドであり
Parallel.ForEach
の呼び出しは完了を待ちません。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;
これは動作しますが、await の巧妙な機能を完全に無効にしてしまうので、手動で例外処理を行う必要があります...。(簡潔さのために削除)。
を実装するにはどうすればよいのでしょうか?
Parallel.ForEach
ループで、ラムダ内で await キーワードを使用しますか?可能でしょうか?
Parallel.ForEachメソッドのプロトタイプは、Parallel.ForEachメソッドと同様に
Action<T>
をパラメータとした場合、非同期ラムダを待つようにしたい。
どのように解決するのですか?
単純な並列化だけなら、こうすればいいんです。
var bag = new ConcurrentBag<object>();
var tasks = myCollection.Select(async item =>
{
// some pre stuff
var response = await GetData(item);
bag.Add(response);
// some post stuff
});
await Task.WhenAll(tasks);
var count = bag.Count;
もっと複雑なものが必要な場合は、以下をチェックしてください。
Stephen Toubの
ForEachAsync
ポスト
.
関連
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] C#で同期メソッドから非同期メソッドを呼び出すには?
-
[解決済み] foreachループの現在の反復処理のインデックスを取得するにはどうすればよいですか?
-
[解決済み] Distinct() with lambda?
-
[解決済み] ロックステートメントのボディ内で 'await' 演算子を使用できないのはなぜですか?
-
[解決済み] C#でawaitを使わずに非同期メソッドを安全に呼び出す方法
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み】Parallel.ForEachでawaitをネストする【重複あり
-
[解決済み] 非同期I/Oの同時処理量を制限するには?