2

考虑下面的代码:

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安全?doworkMyMethodworker.RunWorkerAsync

4

2 回答 2

4

这里没有问题,flag因为有一个叫做Closures的概念。但是,尤其是线程,这可能很危险(使用您最喜欢的搜索引擎)。

于 2013-06-11T10:38:48.273 回答
0

根据您对“安全”的定义,可以检查其中的局部变量flagDoWork因为它仍然在该方法的范围内。话虽如此,它可能不一定是线程安全的。

于 2013-06-11T10:38:45.937 回答