可能重复:
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);
}
}
}
目标基本上是将线程一个一个地添加到队列中,然后一个一个地通过队列并弹出一个线程并执行它。因为我的 for 循环中有“x<2”,所以它应该只创建两个线程 - 一个运行 WriteNumber(0),一个运行 WriteNumber(1),这意味着我应该以 1000 个 0 和1000 1 在我的屏幕上以不同的顺序显示,具体取决于线程的最终执行方式。
我最终得到的是2000 2。我想出的两个可能的解决方案是:我错过了一些非常明显的事情,或者将变量 x 发送到 WriteNumber 函数正在执行传递引用而不是传递值,所以当线程执行他们使用最新版本的 x 而不是设置函数时的版本。但是,据我了解,变量在 C# 中默认按值传递,并且只有在参数中包含“ref”时才通过引用传递。