有那些[MTAThread]和[STAThread]屬性控制 .Net 應用程式中 COM 的單元執行緒模型,根據我自己的(非常有限的)測驗,如果從控制臺 C# 應用程式的主執行緒呼叫,則CoInitializeEx()回傳1( S_FALSE)。
根據 Microsoft 檔案,S_FALSE意思是“COM 庫已在此執行緒上初始化”。
我想知道的是,框架本身是否真的有合同保證,COM 將在每個 .Net(框架或核心應用程式)執行緒上初始化?
如果是這樣,是否還保證所有執行緒都將使用相同的(STA 或 MTA)模型進行初始化?
我問這個,因為DirectShow的應用是至關重要的COM每執行緒初始化,我想,以避免重復呼叫尖刻的代碼CoInitializeEx()和CoUnitialize()如果這些已經隱含由框架處理。
uj5u.com熱心網友回復:
檔案指出來自托管執行緒池的執行緒是
在多執行緒公寓里
的檔案Task.Run()還指出它
將指定的作業排入佇列以在 ThreadPool 上運行
(ThreadPool在這種情況下是托管執行緒池。)
最后,類 Thread 過時的 ApartmentState 屬性的檔案指出
在 .NET Framework 2.0 版中,如果新執行緒在啟動之前尚未設定它們的單元狀態,則它們將被初始化為 ApartmentState.MTA。
這幾乎涵蓋了創建執行緒的所有托管方式。
您當然也可以[MTAThread]在您的Main()方法上添加一個屬性,但即使這樣也沒有必要,因為主入口點的默認值也是 MTA。
所以在一天結束時 - 除非您呼叫任何不尋常的第三方代碼,否則您幾乎可以保證您的執行緒將是 MTA。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/367708.html
