2011-10-13 79 views
1

以这种方式编写代码是否安全?需要关于线程安全性的建议

 var form = new Form(); 

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

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

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

回答

3

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

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

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

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

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