私が見る限り、これは完全に非決定論的です。10 個のゼロから 10 個までのすべての方法で値を取得し、その間のすべての増分バリエーションを得ることができます。
numCounter
その理由は、変数への同期および/またはシリアル化されたアクセスがまったくないためです。スレッドは、スレッドが実行されているときにのみそれを読み取ります。これは、任意の数の環境条件に基づいて、いつでも発生する可能性があります。
繰り返しなしですべての数字を取得する簡単な方法は次のとおりです。
public int numCounter;
private void button2_Click(object sender, EventArgs e)
{
for (numCounter = 0; numCounter < 10; numCounter++)
{
Thread myThread = new Thread(myMethod);
myThread.Start(numCounter);
}
}
public void myMethod(object numCounter)
{
Console.WriteLine(numCounter);
}
ここでの主な欠点は、1) の署名を変更する必要があること、2)から anにmyMethod
変換するときにボックス化が発生すること、3) 出力が予想される順序 0..10 であることを保証できないことです。numCounter
int
object
delegate
これは、aとBeginInvoke
/を使用する少し異なるバージョンですEndInvoke
(スレッド化を行うのが好きな方法です)。上記の欠点 #2 を排除しますが、それでも #1 と #3 を維持します。
public int numCounter;
private delegate void MyMethodDelegate(int numCounter);
private void button2_Click(object sender, EventArgs e)
{
for (numCounter = 0; numCounter < 10; numCounter++)
{
MyMethodDelegate myDelegate = new MyMethodDelegate(myMethod);
myDelegate.BeginInvoke(numCounter, myMethodDone, myDelegate);
}
}
public void myMethod(int numCounter)
{
Console.WriteLine(numCounter);
}
public void myMethodDone(IAsyncResult result)
{
MyMethodDelegate myDelegate = result.AsyncState as MyMethodDelegate;
if (myDelegate != null)
{
myDelegate.EndInvoke(result);
}
}