[解決済み】Parallel.ForEachとTask.Run、Task.WhenAllとの比較
2022-04-15 03:39:21
質問
一連のタスクを非同期に開始するために、Parallel.ForEachとTask.Run()を使用することの違いは何でしょうか。
バージョン1:
List<string> strings = new List<string> { "s1", "s2", "s3" };
Parallel.ForEach(strings, s =>
{
DoSomething(s);
});
バージョン2です。
List<string> strings = new List<string> { "s1", "s2", "s3" };
List<Task> Tasks = new List<Task>();
foreach (var s in strings)
{
Tasks.Add(Task.Run(() => DoSomething(s)));
}
await Task.WhenAll(Tasks);
解決方法は?
この場合、2番目のメソッドはブロックするのではなく、非同期でタスクの完了を待ちます。
しかし、このように
Task.Run
をループで使用します。
Parallel.ForEach
があります。
Partitioner
を作成し、必要以上のタスクを作らないようにしています。
Task.Run
は常に1つのアイテムにつき1つのタスクを作りますが(こうしている以上
Parallel
クラスは作業をバッチ処理するので、作成するタスクの数は作業項目の総数より少なくなります。これにより、特にループ本体が1項目あたりの作業量が少ない場合、全体的なパフォーマンスが大幅に向上します。
このような場合、両方のオプションを組み合わせて記述することができます。
await Task.Run(() => Parallel.ForEach(strings, s =>
{
DoSomething(s);
}));
なお、このように短く書くこともできます。
await Task.Run(() => Parallel.ForEach(strings, DoSomething));
関連
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] 複数のタスクにasync/awaitを使用する
-
[解決済み] await/asyncを使用しているときにHttpClient.GetAsync(...)が返らない
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
-
[解決済み】非同期処理の待ち時間、Wait()でプログラムがフリーズする原因はここにある
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み] 2つのリストを結合する
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み】Parallel.ForEachとTask.Factory.StartNewの比較