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

时间:2013-06-11 10:23:57

标签: c# .net multithreading

考虑以下代码:

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事件,该事件在不同的线程上运行其方法。是否在flag eventhandler中检查局部变量dowork的值是否安全,因为我觉得在调用MyMethod后代码退出worker.RunWorkerAsync

2 个答案:

答案 0 :(得分:4)

由于名为Closures的概念,此处flag没有问题。但是,特别是对于线程而言可以是危险的(使用您最喜欢的搜索引擎)。

答案 1 :(得分:0)

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