次のコードでは、配列の他のすべての要素だけが読み込まれているようです。どうして?Parallel.For要素をスキップする
Random rand = new Random();
int byteLength = 10000000;
var result = new byte[10][];
Parallel.For(0, 10, (i) =>
{
int length = rand.Next(byteLength);
var tempResult = new byte[length];
Thread.Sleep(100);
rand.NextBytes(tempResult);
result[i] = tempResult;
});
すべての要素を充填し、この(非平行)コードとは対照:MSDNでドキュメントのthe examplesに比較
rand = new Random();
var result2 = new byte[10][];
for (int i = 0; i < 10; i++)
{
int length = rand.Next(byteLength);
var tempResult = new byte[length];
Thread.Sleep(100);
rand.NextBytes(tempResult);
result2[i] = tempResult;
}
、私はresult
がParallel.For
デリゲート外にあるためである疑い - したがって、result
にアクセスするとスレッドに問題があります。しかし、マルチスレッドの初心者として、私はこれが当てはまるとは思わない。
複数のスレッドから「ランダム」のインスタンスを1つ使用しています。それは悪い考えです。「System.Random」はスレッドセーフではありません。それでも、すべての要素を埋める必要があります...あなたは正確に何を見ていますか? NULL参照、またはすべてのバイトが0のエントリだけ? –
System.Randomはスレッドセーフではありません。 –
System.Randomをご利用いただきありがとうございます。変更するとインスタンスが作成され、デリゲート内で問題が解決されるようです。誰でも答えとして書くように気をつけて、私は答えとしてマークしますか? –