需要有关线程安全的建议

时间:2011-10-13 07:59:31

标签: c# .net multithreading thread-safety clr

以这种方式编写代码是否安全?

        var form = new Form();

        Action callback = 
            () =>
                {
                    // do something 1
                };

        ThreadPool.QueueUserWorkItem(
            args =>
                {
                    // do something 2
                    form.BeginInvoke(callback);
                });

UPD我担心访问“表单”变量的安全性。我从后台线程使用BeginInvoke方法;我能确定在此之前不会有任何读/写重新排序吗? (从后台线程的角度来看,这可能会使“form”变量处于不一致状态)

2 个答案:

答案 0 :(得分:3)

是的,看起来不错。变量form将被捕获,只要它不是null,当ThreadPool上的作业执行时它应该工作。

但是你遗漏了很多细节,我假设这个代码全部来自1种方法。

// do something 1可以访问GUI,// do something 2不能。

答案 1 :(得分:1)

ThreadPool.QueueUserWorkItem(
args =>
{
    // do something 2
    form.BeginInvoke(x);
});

这里实际发生的是编译器为您创建一个全新的类,并且在其中有一个成员变量来保存您的Form实例。这个类是新的,然后传递给ThreadPool.QueueUserWorkItem()。所以是的,这是线程安全的。