重複の可能性:
ループ内の C# キャプチャ変数
私はスレッド化のいくつかの単純なアプリケーションに取り組んでいますが、これを機能させることができないようです:
class ThreadTest
{
static Queue<Thread> threadQueue = new Queue<Thread>();
static void Main()
{
//Create and enqueue threads
for (int x = 0; x < 2; x++)
{
threadQueue.Enqueue(new Thread(() => WriteNumber(x)));
}
while(threadQueue.Count != 0)
{
Thread temp = threadQueue.Dequeue();
temp.Start();
}
Console.Read();
}
static void WriteNumber(int number)
{
for (int i = 0; i < 1000; i++)
{
Console.Write(number);
}
}
}
目標は基本的に、スレッドをキューに 1 つずつ追加してから、キューを 1 つずつ調べて、スレッドをポップオフして実行することです。for ループに "x<2" があるため、2 つのスレッドのみを作成する必要があります。1 つは WriteNumber(0) を実行するスレッド、もう 1 つは WriteNumber(1) を実行するスレッドです。つまり、1000 の 0 とスレッドが最終的にどのように実行されるかによって、さまざまな順序で画面に 1000 個の 1 が表示されます。
私が最終的に得たのは2000 2です。私が思いついた 2 つの可能な解決策は次のとおりです。明らかに明らかな何かを見逃しているか、変数 x を WriteNumber 関数に送信することで、値渡しではなく参照渡しを行っているため、スレッドは、関数が設定された時点ではなく、最新バージョンの x を使用して実行されます。ただし、C#ではデフォルトで変数が値渡しされ、パラメーターに「ref」が含まれている場合にのみ参照渡しされることを理解していました。