です。 ...はParallel.forEach(DataTable.AsEnumerable()スレッドセーフ
これらの列のいずれかがインデックス化されている場合答えて
のDataRowクラスのdocumentationは決定的にこの型は、マルチスレッド読み取り操作に対して安全である
と述べています。 はすべての書き込み操作を同期させる必要があります。
それ以上は特定できません。
いずれにしても、Datatableへの並列書き込みは、おそらくうまくスケールされません。共有状態にアクセスする複数のスレッドがあり、単一のデータテーブルが非常に明白に共有状態である場合、スケーラビリティが低下します。さらに、NUMAハードウェアを使用しない限り、CPUコアは同じメモリバスへのアクセスを競合します。
並列処理(「その他のもの」)の結果を別の構造体(たとえばone of the concurrent collections)に戻し、ループが終了すると1つのスレッドから変更を適用する方がよいでしょう。
もう1つの方法は、PLINQを使用して結果を計算し、単純なforeachを使用してそれらを反復処理して、変更をDataTableに適用することです。
元のデータテーブルを完全に破棄し、必要なフィールドを含む新しいオブジェクトを返すことも、より良い解決策です。コードで結果をDataTableにする必要がない場合は、結果をIEnumerableとして返すことができます。
私はあなたの答えを理解しています:たとえば、200行を含むデータテーブルの列Xを変更する必要がある場合、200行すべての列Xから値を取り出し、並行コレクションに格納してから、その同時収集で.For()を実行して値を変更し、単一スレッドでループして元のDataTableの列Xを同時収集の値から更新しますか? –
いいえ、反対です。複数のスレッドから値を読み取っても問題ないので、それらを抽出する必要はありません。 200個の値を並行して処理する必要があると仮定すると、処理の結果を並行コレクションで収集してから、それらを単一のスレッドからテーブルに戻す必要があります。 –
200は私が思った乱数だけでしたが、それはもっと多くのもののようでした。私の状況では、私はそのテーブルの1列が暗号化されているデータベースにテーブルを持っています。私はこのテーブルのすべての行をdbのDataTableにロードしてから、すべての行をループしてその列を解読する必要があります。私は値を同時に読み取って解読することができますが、元の行と列を更新するために、私はあなたのコメントを理解していると思います。 –
、それは間違いなく安全ではありません。
ない場合、それは安全かもしれないが、私はそうは思わない。
- 1. はここParallel.ForEach
- 2. Parallel.ForEachはブロックしますか?
- 3. .NET 4.0のParallel.ForEach
- 4. AsParallel.ForAll対Parallel.ForEach
- 5. Parallel.ForEachとAsParallel()。ForAll
- 6. Parallel.ForEachループ動作
- 7. Parallel.ForEachとListViewコントロール
- 8. .NET 4 ... Parallel.ForEach()question
- 9. Parallel.ForEachのC#エラー
- 10. タスクParallel.For Parallel.ForEachロードバランシング、ネット
- 11. Parallel.ForEach - 正常なキャンセル
- 12. Parallel.ForEachの最初のループ
- 13. コントロールコンテナの逆転とスレッド/ Parallel.ForEach
- 14. BlockingCollection.GetConsumableEnumerableを持つParallel.ForEachループ
- 15. Parallel.Foreachのチャンク分割IEnumerable
- 16. スレッドセーフ
- 17. はRSA_signスレッドセーフです
- 18. callFromThreadはスレッドセーフです
- 19. スレッドセーフな方法は、
- 20. PHPスレッドセーフでWindows用でないスレッドセーフ
- 21. MSMQスレッドセーフ
- 22. JTextAreaスレッドセーフ?
- 23. RxJavaスレッドセーフ
- 24. Rebusスレッドセーフ
- 25. チェーンされたスレッドセーフなコレクションはスレッドセーフですか?
- 26. Parallel.ForeachとCでの並列実行
- 27. Parallel.Foreachをスレッド内で使用する
- 28. foreachループをParallel.ForEachループに変更する
- 29. 入れ子になったParallel.ForEachループ
- 30. .NETモジュールはスレッドセーフですか?
「DataTable」は非常に複雑な獣です。 – SLaks
複数のプロセッサにアプリケーションをデプロイするときに、私が推測してみましょう。愚かな答えかもしれません。 –
"と仮定すると、' u'と 'mptions'の間違いが起きますか? Psst ..という言葉は "仮定"ではなく "仮定"である); – Jamiec