Выбор модели потоков

Выбор модели потоков для объекта зависит от функции объекта. Объект, выполняющий широкий объем операций ввода-вывода, может поддерживать свободную многопоточность для обеспечения максимальной отзывчивости для клиентов, разрешая вызовы интерфейса во время задержки ввода-вывода. С другой стороны, объект, взаимодействующий с пользователем, может поддерживать потоки квартир для синхронизации входящих вызовов COM с операциями окна.

Проще поддерживать потоки квартир в однопоточных квартирах, так как COM обеспечивает синхронизацию на основе каждого вызова. Поддержка свободного потока выполнения сложнее, так как объект должен реализовать синхронизацию; однако ответ для клиентов может улучшиться, так как синхронизация может быть реализована для небольших участков кода.

Tip

Краткое руководство по принятию решений для клиентов 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 вызывающего потока (наиболее распространённый вариант для объектов, связанных с пользовательским интерфейсом)
  • Free — объект работает в MTA
  • Both — Объект выполняется в квартире вызывающего объекта (лучше всего для объектов общего назначения)
  • Neutral — объект выполняется в нейтральном апартаменте (только для COM+)

Если вы не уверены, начните с Both и убедитесь, что ваш объект потокобезопасен. Это уменьшает маршалинг между квартирами, позволяя COM создать объект в квартире вызывающего абонента, хотя маршалинг может по-прежнему возникать для перекрестных обратных вызовов или доступа из других квартир.

доступ к интерфейсам между квартирами

многопоточные апартаменты

In-Process Проблемы с потоками сервера

процессы, потоки и аппартаменты

Single-Threaded и многопоточный обмен данными

Single-Threaded квартиры