2012-03-11 6 views
1

これは私が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'に異なる値が表示されます。

パラレルループを理解してください。

+1

これはparallel.foreachではなくRandomでの問題だとは思わない。ループに同じランダムインスタンスを使用すると、より予測可能な結果が表示されることがあります。 –

+0

静的関数を使用する場合は、独自のコンテナで実行するという考え方を無効にします。 –

+0

@ Gary.Sでは、 'Random'はスレッドセーフではないため、1つのインスタンスが正しく動作しません。 – svick

答えて

2

これは、ランダムが実際にランダムではなく擬似ランダム(http://msdn.microsoft.com/en-us/library/system.random.aspx)であるために発生します。この正確な問題は、MSDNの記事の発言に記載されています。複数のインスタンスが同時に作成され、.Next()が両方のインスタンスで呼び出された場合、それらは(システムクロックの有限の解像度のために)同じ結果に終わる可能性があります。これに対処するために、反復ごとに固有のシードを作成する必要があります。そのために、あなたはこのような何かを行うことができます(ただし、この猫を肌には多くの方法があります):

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(s.GetHashCode()); 
    int i = r.Next(1, 100); 
    Thread.Sleep(1000); 
    Console.WriteLine(string.Format("Month Name {0} and Random ID assigned {1}", s, i)); 
} 

**この例では、一意性を保証するものではありませんが、単にシードの値を生成する方法として示されていることに注意してください**

+3

'Random.Next()'はスレッドセーフではないので、この方法で使用すると予測できないことに注意してください結果。 – dlev

+0

@dlevこれは事実ですが、より良い例は、反復ごとに一意のシードを持つRandomオブジェクトを作成することです。 –

+0

説明ありがとうございます! –

関連する問題