選擇線程模型

選擇物件的線程模型取決於物件的函式。 執行大量 I/O 的物件可能支援自由線程,藉由允許在 I/O 延遲期間呼叫介面,來提供用戶端的最大回應。 另一方面,與使用者互動的物件可能支援Apartment線程,以同步處理內送 COM 呼叫與其窗口作業。

在單執行緒的公寓模型中支援公寓線程比較容易,因為 COM 會根據每次呼叫提供同步處理。 支援自由線程比較困難,因為對象必須實作同步處理;不過,對客戶端的回應可能更好,因為可以針對較小的程式代碼區段實作同步處理。

小提示

COM客戶快速決策指南:

// UI thread or main thread with a message loop → STA
HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

// Background/worker thread with no message loop → MTA
HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);

對於 COM 伺服器(進行中的 DLL),請在鍵ThreadingModel值下設定InprocServer32登錄檔值:

  • Apartment — 物件在呼叫者的 STA 中執行(這對 UI 相關物件最為常見)
  • Free — 物件在 MTA 中執行
  • Both — 物件運行於呼叫者的公寓(最適合一般用途物件)
  • Neutral — 物件運行於中立公寓(僅限 COM+)

如果不確定,請從 Both 開始,並確保你的物件是執行緒安全的。 這可減少跨公寓封送處理,因為 COM 可讓物件在呼叫端所在的公寓中建立,不過在跨公寓回呼或從其他公寓存取時,仍可能發生封送處理。

跨公寓存取介面

多線程公寓

In-Process 伺服器線程問題

進程、執行緒和套件

Single-Threaded 和多線程通訊

Single-Threaded 公寓