爲何 WPF 的 Main 方法須要標記 STAThread 。

在編寫 WPF 程序時,會發現 Main 方法上方會標記 [STAThread] 。html

做用:STAThread 標記主線程,也就是 UI 線程是 STA 線程模型。安全

1 什麼是 STA ?

與 STA(Single-Thread Apartment)對應的,是 MTA(Mutil-Thread Apartment),是 COM 組件中的概念,用於指示一個 COM 組件的線程模型。多線程

詳細能夠參看: 多線程調用COM組件的體會(CoInitialize) - 莊園 - 博客園 關於COM組件線程模型的實驗_晨星_新浪博客框架

關於 STA 與 MTA 的區別,能夠參看:性能

C# Thread STA模式 與MTA模式 - 程序園 Difference between STA and MTA - Interview Questions .net - Could you explain STA and MTA? - Stack Overflowgoogle

一個 STA 的 COM 組件,只能在 STA 線程模型下運行。spa

WPF 與 COM 組件

那,WPF 和 COM 組件又有什麼關係? WPF 是一套 Windows 下的 UI 框架,對 UI 的實現,能夠理解爲就是對 Win32 API 和 COM 組件的封裝。(COM 組件是另外一種 Windows API 的形式,能夠理解爲對 Win32 API 的封裝。), 因此,若是 WPF 想要複用 COM 組件,就須要遵循 COM 組件的規則。用到了 STA 線程模型的 COM 組件,則線程也須要是 STA 模式。.net

若是沒有標記,則線程默認是 MTA 模式。線程

WPF 的 UI 單線程

WPF 的 UI 是單線程的,直接跨線程訪問 UI 元素會出現訪問錯誤,能夠使用 Dispatcher 進行封送 UI 操做,具體能夠參看:Windows 消息循環(2) - WPF中的消息循環 。 除了與 COM 組件的關係,能夠從另外一個角度來理解,爲何 UI 線程會設計成單線程? 多線程會有資源訪問的競爭問題,要處理處理這些問題,則須要完成大量線程同步的問題,即耗性能,也難以作到安全。設計

原文連接: https://www.cnblogs.com/jasongrass/p/11885478.html

相關文章
相關標籤/搜索