需要线程安全方面的建议
本文关键字:方面 安全 线程 | 更新日期: 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()
。所以,是的,它是线程安全的