2013-09-26 26 views
1

如果訪問是寫訪問權限,我是否只需要使用Invoke?無需調用就可以安全地獲取GUI對象的屬性?C#只能調用寫入權限嗎?

new Thread(() => 
{ 
    Invoke((MethodInvoker)(() => mbrVerticalProgressBar1.Value++)); 

if (TaskbarManager.IsPlatformSupported) 
{ 
    TaskbarManager.Instance.SetProgressValue(
     mbrVerticalProgressBar1.Value, 
     mbrListOfURLsCount); 
} 
}).Start(); 

回答

2

MSDN Library對此沒有任何疑問,它聲明 Control類的線程不安全的方法和屬性,除了InvokeRequired,BeginInvoke,Invoke和CreateGraphics。

這並不完全準確,但肯定有一些屬性意外地線程安全,因爲它們使用了一個備份變量。你必須知道財產獲得者的實際執行情況,並且冒險將來不會冒險。

是的,ProgressBar.Value使用這樣的後備變量,私人字段。您可以從參考源或反編譯器中知道。然而,這只是對於吸氣者而言,這個吸氣者絕對不是。因爲它需要實際上獲得要更改的控件的可見外觀。

順便說一句,總是贊成BeginInvoke over Invoke。 Invoke具有相當不愉快的特性,它很容易造成死鎖,並且非常緩慢。你只需要需要當你需要它的返回值時調用(),而不是這裏的情況。

1

這取決於將要寫的內容。例如,您可以在任何線程中讀取/寫入Tag控件的屬性,而不會有任何問題。

技術上任何觸發調用Control.Handle屬性應該是在UIThread因爲UIThread擁有該控制,因此它應該只有線程訪問,否則最終會拋出一個調試器附着時InvalidOperationException