线程使用本地变量时的奇怪行为
本文关键字:变量 线程 | 更新日期: 2023-09-27 18:26:39
我写了一个简单的代码
void go()
{
int i = 5;
ThreadPool.QueueUserWorkItem(delegate
{
for (int j = 1; j <= 1000; j++)
Console.Write(i);
});
for (int k = 1; k <= 1000; k++)
i = k;
Console.ReadLine();
}
我得到的是:100010001000100010001000....
我不知道为什么,我希望有人能给我解释一下,谢谢!
将k
分配给i
的循环在启动排队线程之前运行。
因此,在启动排队线程时,i
的值为1000
,这就是您所看到的。
将代码更改为类似的代码
void go()
{
int i = 5;
int i1 = i; //note this
ThreadPool.QueueUserWorkItem(delegate
{
for (int j = 1; j <= 1000; j++)
Console.Write(i1); //and note this
});
for (int k = 1; k <= 1000; k++)
i = k;
Console.ReadLine();
}
Resharper报告"访问修改后的闭包"。