問題タブ [parallel.invoke]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Parallel.Invoke と Parallel.ForEach は本質的に同じものですか?
そして、「同じこと」とは、これら 2 つの操作が基本的に同じ作業を行うことを意味します。つまり、作業する必要があるものに基づいて、どちらを呼び出すのがより便利であるかということです。(つまり、デリゲートのリストまたは反復するもののリスト)? MSDN、StackOverflow、およびさまざまなランダムな記事を検索してきましたが、これに対する明確な答えをまだ見つけていません。
編集: もっと明確にすべきでした。2 つの方法が同じことを行うかどうかを尋ねているのは、そうでない場合、どちらがより効率的かを理解したいからです。
例: 500 個のキー値のリストがあります。現在foreach
、リストを (シリアルに) 反復処理し、各項目に対して作業を実行するループを使用しています。複数のコアを利用したい場合は、Parallel.ForEach
代わりに単純に使用する必要がありますか?
議論のために、これらの 500 のタスクに対して 500 のデリゲートの配列があるとしましょう。500 のデリゲートParallel.Invoke
のリストを呼び出して与えることで、最終的な効果は異なるでしょうか?
c# - Parallel.Invoke とスレッド呼び出し - 明確化?
デッドロックを作成する次のコードがあります。
結果 :
1の前
(そしてデッドロック....)
これは、コードの制御を超えてインスタンスをロックするのは悪い習慣であることはわかっていますthis
。しかし、それはこの質問のためだけです。
ここでデッドロックが発生する理由が理解できます。
メインスレッドが in を取得するlock(test)
とmain
、新しいスレッドが呼び出しを開始します - そこで同じインスタンス変数DoWorkUsingThisLock
のロックを取得しようとし、スタックします ( atのため)t1.Wait()
main
わかった
しかし、デッドロックも引き起こすこの回答をここで見ました。
結果は次のとおりです。
ClassTest.DoWorkUsingThisLock 1
前 ClassTest.DoWorkUsingThisLock 2
ClassTest.DoWorkUsingThisLock 1 // <---- どのように ?
ClassTest.DoWorkUsingThisLock 完了 1
質問:
最初の呼び出しでロックを取得したのはなぜですか ( DoWorkUsingThisLock(1)
)? lock
atは、 どの DOES ブロックmain
が原因でまだブロックされています ! スレッドがセクションParallel.Invoke
に入るのに成功した方法がわかりません。lock(this)
vb.net - Parallel.Invoke のアクションごとに log4net で個別のログ ファイルを作成するにはどうすればよいですか?
Action
を使用して並行して実行したい一連のがありParallel.Invoke
ます。しかし、それぞれについてAction
、log4net によって作成された個別のログ ファイルが必要です。私のlog4net構成ファイルでは、これを追加しました:
実行するアクションが 1 つしかない場合、これは正常に機能します。ログ ファイルには正しいファイル名が含まれています。
ただし、実行するエントリが複数ある場合はAction
、すべてのログ エントリが同じログ ファイルになります。
を作成するためのコードAction
は次のとおりです。
作成されるログ ファイルは、プロパティに割り当てられた値の 1 つを使用していUniqueIdentifier
ます。この値がどのように選択されるかわかりません。常に最初または最後であるとは限りません。上記の例では、ファイルのみ3S2M3_0004.log
が作成され、すべてのログ エントリが含まれています。
LogicalThreadContext と ThreadContext の両方を試しましたが、違いはありません。
c# - 大きなリストで並列プロセスを実行するための Parallel.Invoke と Parallel.Foreach の比較
約 8000 個のアイテム (ファイル パス) を含む C# リストがあります。これらすべてのアイテムに対してメソッドを並行して実行したいと考えています。これには、以下の 2 つのオプションがあります。
1) リストを小さなチャンク (それぞれ 500 サイズなど) に手動で分割し、これらの小さなリストのアクションの配列を作成してから、以下のように Parallel.Invoke を呼び出します。
2) 2 番目のオプションは、以下のように Parallel.ForEach を実行することです。
- ここで最良の選択肢は何ですか?
- Parallel.Foreach はどのようにリストを小さなチャンクに分割しますか?
提案してください、事前に感謝します。