共用方式為


Managed 和 Unmanaged 執行緒處理

更新:2007 年 11 月

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。請在啟動執行緒之前,使用 SetApartmentStateTrySetApartmentState 方法來設定 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 進行。

請參閱

概念

將 COM 元件公開給 .NET Framework

將 .NET Framework 元件公開給 COM

其他資源

進階 COM 互通性