我有以下的代码,它创建了10个线程,这些线程会向控制台输出消息:
for (int i = 0; i < 10; i++)
{
{
Thread thread = new Thread((threadNumber) =>
{
for (int j = 0; j < 10; j++)
{
Thread.Sleep(200);
Console.WriteLine(string.Format("Thread: {0}, Line: {1}", threadNumber, j));
}
});
thread.Start(i);
}
}
我的理解是,ParameterizedThreadStart
会接收一个对象,该对象的引用副本会发送到线程。如果是这种情况,由于我没有在每个循环中制作i
的本地副本,所有新线程都将指向相同的内存位置,这意味着某些线程号可能被“跳过”。然而,我已经运行了这个程序(即使对更多的线程/睡眠时间),每个i
的值都有自己的线程。有人能解释一下为什么吗?
var i1 = i
并在使用i
的任何地方使用i1
来获得正确的结果。 - lobsterism