[解決済み】Parallel.ForEachとTask.Factory.StartNewの比較
2022-04-02 20:03:57
質問
以下のコードスニペットの違いは何ですか?どちらもスレッドプールスレッドを使用するのではありませんか?
例えば、コレクション内の各項目に対して関数を呼び出したい場合。
Parallel.ForEach<Item>(items, item => DoSomething(item));
vs
foreach(var item in items)
{
Task.Factory.StartNew(() => DoSomething(item));
}
解決方法は?
1つ目は、より良い選択肢です。
Parallel.ForEachは、内部的には
Partitioner<T>
を使用して、コレクションをワークアイテムに分散させます。 1つのアイテムに1つのタスクを実行するのではなく、バッチ処理でオーバーヘッドを低減します。
2番目のオプションは、1つの
Task
コレクション内のアイテムごとに 結果はほぼ同じですが、特に大きなコレクションの場合、必要以上のオーバーヘッドが発生し、全体の実行時間が遅くなります。
参考までに - 使用されるパーティショナーは、適切な をオーバーロードしたものです。 を使用します。 詳しくは カスタムパーティショナー をMSDNでご覧ください。
実行時の主な違いは、2番目の動作が非同期であることです。 これは、Parallel.ForEachを使うことで、複製することができます。
Task.Factory.StartNew( () => Parallel.ForEach<Item>(items, item => DoSomething(item)));
こうすることで、パーティショナーの利点を生かしつつ、操作が完了するまでブロックしないようにします。
関連
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み] 2つのリストを結合する
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】Parallel.ForEachとTask.Run、Task.WhenAllとの比較