2011-10-13 40 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()。所以是的,它是線程安全的。