2011-07-13 93 views
2

爲什麼不自動處理跨線程UI更新安全性?爲什麼編譯器(或運行時)沒有爲我執行InvokeRequired模式?

爲了確保可能從另一個線程更新UI時的線程安全性,我們必須編寫if (Control.InvokeRequired()) Invoke(..)模式或其他等效模式。運行時可以觀察我何時從另一個線程調用UI更新方法併爲我整理電話?它必須知道什麼時候需要這個,因爲如果你沒有采取必要的預防措施,它會拋出異常。

編譯器能否在每次UI更新調用時爲我應用模式?如果這會導致不可接受的開銷,那麼這個特性可能受應用程序屬性控制(開發人員只有在編寫多線程應用程序時纔會應用這個屬性,在這個應用程序中會發生跨線程UI更新)。

我可以想象幾個潛在的答案:要麼是愚蠢的想法,要麼是因爲它不可能/不切實際,或者僅僅是沒有看到增加足夠的價值來證明開發成本。

+1

因爲它是一種廣泛濫用的反模​​式。編寫可以在UI線程和工作線程上運行的代碼是非常罕見的。 InvokeRequired應該用於診斷。因爲如果在*知道代碼在工作人員上運行時返回false,則會出現嚴重錯誤。 –

+0

@Hans:會發生嗎? –

+0

是的,在Windows創建窗口之前,馬上啓動線程。或者更常見的是,在允許窗口關閉之前忘記確保線程已經停止。 –

回答

1

我不能回答爲什麼雖然我可以問,如果這個功能是值得測試的成本,維護文件等....時,你可以添加一個方法,如:

public static void UpdateControl(this Control ctrl, Action<Control> action) 
    { 
     if (ctrl.InvokeRequired) 
     { 
      ctrl.Invoke(action,ctrl); 


     } 
     else 
     { 
      action(ctrl); 

     } 

    } 

然後,您可以使用此類似this.textBox.UpdateControl(c=>c.Text="Thread Safe");

+0

同意。當然有很多語言特徵被考慮,但認爲不值得實施。如果是這種情況,我希望得到證實(希望Eric Lippert或另一位MS架構師會加入)。 –

相關問題