爲什麼不自動處理跨線程UI更新安全性?爲什麼編譯器(或運行時)沒有爲我執行InvokeRequired模式?
爲了確保可能從另一個線程更新UI時的線程安全性,我們必須編寫if (Control.InvokeRequired()) Invoke(..)
模式或其他等效模式。運行時可以觀察我何時從另一個線程調用UI更新方法併爲我整理電話?它必須知道什麼時候需要這個,因爲如果你沒有采取必要的預防措施,它會拋出異常。
編譯器能否在每次UI更新調用時爲我應用模式?如果這會導致不可接受的開銷,那麼這個特性可能受應用程序屬性控制(開發人員只有在編寫多線程應用程序時纔會應用這個屬性,在這個應用程序中會發生跨線程UI更新)。
我可以想象幾個潛在的答案:要麼是愚蠢的想法,要麼是因爲它不可能/不切實際,或者僅僅是沒有看到增加足夠的價值來證明開發成本。
因爲它是一種廣泛濫用的反模式。編寫可以在UI線程和工作線程上運行的代碼是非常罕見的。 InvokeRequired應該用於診斷。因爲如果在*知道代碼在工作人員上運行時返回false,則會出現嚴重錯誤。 –
@Hans:會發生嗎? –
是的,在Windows創建窗口之前,馬上啓動線程。或者更常見的是,在允許窗口關閉之前忘記確保線程已經停止。 –