Managed 和 Unmanaged 執行緒處理
COM 元件是使用 Apartment 來同步 (Synchronize) 存取資源。 相反地,Managed 物件則是使用同步化區域、Mutex、鎖定和完成通訊埠,以及同步化內容這類同步基本方式,來確保所有共用資源都是以執行緒安全的方式被使用。 如需 .NET 執行緒模型的詳細資訊,請參閱 Managed 執行緒處理。
基於互通性 (Interoperability),Common Language Runtime 在呼叫 COM 物件時,會建立並初始化一個 Apartment。 Managed 執行緒可以建立並且進入只含有一個執行緒的單一執行緒 Apartment (STA),或者含有一個以上執行緒的多執行緒 Apartment (MTA)。 當 COM Apartment 與執行緒產生的 Apartment 相容時,COM 會讓呼叫的執行緒直接對 COM 物件進行呼叫。 如果這些 Apartment 不相容,COM 會建立一個相容的 Apartment 並且透過新 Apartment 中的 Proxy 封送處理所有呼叫。
執行階段會呼叫 CoInitializeEx 將 COM Apartment 初始化為 MTA 或 STA Apartment。 在 .NET Framework 2.0 版中,如果在啟動 Managed 執行緒之前沒有設定它們的 Apartment 狀態,則 Managed 執行緒會初始化為 MTA。 請在啟動執行緒之前,使用 SetApartmentState 或 TrySetApartmentState 方法來設定 Apartment 狀態。
在 .NET Framework 2.0 版中,除非將 STAThreadAttribute 套用至進入點程序,否則主應用程式的執行緒會初始化為 MTA。
注意事項 |
---|
在 .NET Framework 1.0 和 1.1 版中,您可以使用 System.Threading.ApartmentState 屬性在執行緒執行之後設定 Apartment 狀態;這會造成競爭的情況。在 .NET Framework 2.0 版中,這是不允許的。 |
一些程式撰寫模型 (Programming Model) 需要您設定執行緒的 STA 屬性。 例如,若要 Windows Form 初始化項目,例如拖放,您必須建立和輸入單一執行緒 Apartment。
注意事項 |
---|
如果 Proxy 和 Stub 或型別程式庫都沒有註冊,從 Managed 程式碼呼叫 COM 物件時,可能會發生 InvalidCastException。 |
以下表格列出了 ApartmentState 列舉值,並且顯示了相當的 COM Apartment 初始設定呼叫。
ApartmentState 列舉值 |
COM Apartment 初始設定 |
---|---|
MTA |
CoInitializeEx(NULL, COINIT_MULTITHREADED) |
STA |
CoIntializeEx(NULL, COINIT_APARTMENTTHREADED) |
未知 |
CoInitializeEx(NULL, COINIT_MULTITHREADED) |
只要 COM 物件和 Managed 執行緒在不同容的 Apartment 中,物件上的所有呼叫都是透過 COM 建立的 Proxy 進行。