的COINIT - 用於指定窗口線程是否是在單個或線程單元的枚舉 - 文檔(http://msdn.microsoft.com/en-gb/library/windows/desktop/ms678505(v=vs.85).aspx)指出:爲什麼gui線程不能在多線程的公寓中運行?
多線程單元是用於通過非GUI線程使用。多線程套件中的線程不應該執行UI操作。這是因爲UI線程需要消息泵,並且COM不會爲多線程單元中的線程抽取消息。
爲什麼不應該在多線程的線程的公寓執行UI操作?在多線程公寓的線程中發生消息循環有什麼問題? COM以某種方式爲單線程單元中的線程提供自動消息循環?
您可以創建一個線程,擁有它加入MTA,然後在其上運行的消息泵;沒有什麼能阻止你但是,這通常是毫無意義的。如果你在COM服務器上這樣做,並且客戶端在你的COM對象上調用一個方法,這個調用將在*不同的* MTA線程上執行(一個來自COM運行時管理的池)。此外,如果您在這個線程的外的公寓COM調用,調用將阻塞你的UI會出現雄(而從STA線程的亂公寓COM調用旋轉模態的消息泵在等待呼叫返回)。 – 2014-09-06 17:19:45
是的 - 當COM代表您創建STA線程時,此線程將運行消息泵。這發生在MTA線程創建進程內STA COM對象時。 – 2014-09-06 17:21:03
「多線程單元中的線程中發生消息循環有什麼問題?」這不是問題。問題是(正如它在你引用的文檔中所說的)「COM不會爲多線程公寓中的線程抽取消息」。這意味着如果COM需要等待,它將會等待,而不會泵送消息,這會掛起你的UI。 COM在單線程單元中等待時會抽出消息。 – 2014-09-06 17:30:25