私は、URLのリストを取り、それぞれの処理を追加するParallel.ForEach()ループを持っています。私のループの外側では、ループカウンタ変数を宣言しています。ループ本体の内部では、Interlocked.Increment()を使用すると、各スレッドのインターラクションが実行されるたびにカウントを増加させる「スレッドセーフな」方法を維持する最善の方法と考えると思います。私は私が何かに似て見るだろうと思っているだろうInterlocked.Increment()は、私がタスク並列ライブラリで期待していた方法では動作しません。
int counter = 0;
Parallel.ForEach(urlList, (url, state) =>
{
// various code statments
Interlocked.Increment(ref counter);
Debug.WriteLine(" ......... counter: " + counter);
});
: "......... 0" を
......... 1
......... 2
......... 3
......... 4
......... 5
.........
.........
......... n
をしかし、私が代わりに取得することは16である(これが原因であるI 8つのネイティブコアを持つデュアルクアッドコアコンピュータがありますが、ハイパースレッディングが有効になり、合計で16コアになります)。次に、カウンタが通常ほとんど増分されるのを見始めますが、デバッグ出力にカウンタ値が重複していたり、3倍になったりすることがあります。
Parallel.ForEach()を使用すると、ループ反復回数をカウントする最も良い方法は何ですか?アドバイスありがとう。
重複した値が予想されます。しかし、私は0がどこから来たのか分かりません。 – CodesInChaos
回避策は、int myCounter = Interloced.Increment(refカウンタ)を使用しています。 Debug.WriteLine(myCounter); ' – CodesInChaos
実際にコンパイルして問題を示すコードを投稿することはできますか(つまり、prints 0s)? – CodesInChaos