线程使用本地变量时的奇怪行为

本文关键字:变量 线程 | 更新日期: 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报告"访问修改后的闭包"。