需要线程安全方面的建议

本文关键字:方面 安全 线程 | 更新日期: 2023-09-27 18:11:20

这样写代码安全吗?

        var form = new Form();
        Action callback = 
            () =>
                {
                    // do something 1
                };
        ThreadPool.QueueUserWorkItem(
            args =>
                {
                    // do something 2
                    form.BeginInvoke(callback);
                });
我担心访问"form"变量的安全性。我使用BeginInvoke方法从后台线程;我能确定在此之前不会有任何读/写重排序吗?(从后台线程的角度来看,这可能会使"form"变量处于不一致状态)

需要线程安全方面的建议

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

但是你遗漏了很多细节,我假设这段代码都来自一个方法。

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

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

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