运行时不同线程中的变量范围

本文关键字:变量 范围 线程 运行时 | 更新日期: 2023-09-27 18:17:47

考虑以下代码:

public void MyMethod()
    {
        bool flag=true;
        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += (x, y) =>
            {
                //time consuming task
                if (flag)
                {
                    //do something
                }
            };
        worker.RunWorkerCompleted += (x, y) =>
            {
                if (flag)
                {
                    //do something
                }
            };
        worker.RunWorkerAsync();
    }

也许是一个愚蠢的问题,但正如我所理解的,在runworkerasync调用之后,dowork事件被引发,它在不同的线程上运行它的方法。检查dowork事件处理程序内部的局部变量flag的值是否安全,因为我觉得代码在调用worker.RunWorkerAsync后退出MyMethod ?

运行时不同线程中的变量范围

这里flag没有问题,因为有一个叫做闭包的概念。然而,特别是对于线程,这个可能是危险的(使用你最喜欢的搜索引擎)。

根据您对'安全'的定义,可以在DoWork中检查局部变量flag,因为它仍然在该方法的范围内。虽然说它不一定是线程安全的