以这种方式编写代码是否安全?
var form = new Form();
Action callback =
() =>
{
// do something 1
};
ThreadPool.QueueUserWorkItem(
args =>
{
// do something 2
form.BeginInvoke(callback);
});
UPD我担心访问“表单”变量的安全性。我从后台线程使用BeginInvoke方法;我能确定在此之前不会有任何读/写重新排序吗? (从后台线程的角度来看,这可能会使“form”变量处于不一致状态)
答案 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()
。所以是的,这是线程安全的。