これは私がParallel.Foreachループ機能を学ぼうと、いくつかのサンプルテストアプリですParallel.ForEachループ動作
static void Main(string[] args)
{
List<string> Months = new List<string>()
{
"Jan", "Feb", "Mar", "Apr", "May", "June"
};
Parallel.ForEach(Months, (x) => ProcessRandom(x));
Console.ReadLine();
}
public static void ProcessRandom(string s)
{
Random r = new Random();
int i = r.Next(1, 100);
Thread.Sleep(1000);
Console.WriteLine(string.Format("Month Name {0} and Random ID assigned {1}", s, i));
}
並列でのforeachについて私の理解では、それはリストからパラメータを持つProcessRandomメソッドを実行することである
並行して。そのメソッド内のすべての変数は別々になり、互いに独立して実行されます。しかし、私は私が実行するときに整数値に格納されているランダムな値を参照してください私の月のリストから腸内のカップルのための同じ1つまたは2かもしれない別のランダムな値があります。なぜこれはそのように振る舞うのですか?パラレル・ループは反復ごとに新しいランダム値を作成するべきではありません。私がparallelOptionsを使用し、パラレル化のMaxDegreeを1に設定すると、変数 'i'に異なる値が表示されます。
パラレルループを理解してください。
これはparallel.foreachではなくRandomでの問題だとは思わない。ループに同じランダムインスタンスを使用すると、より予測可能な結果が表示されることがあります。 –
静的関数を使用する場合は、独自のコンテナで実行するという考え方を無効にします。 –
@ Gary.Sでは、 'Random'はスレッドセーフではないため、1つのインスタンスが正しく動作しません。 – svick