Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Выбор модели потоков для объекта зависит от функции объекта. Объект, выполняющий широкий объем операций ввода-вывода, может поддерживать свободную многопоточность для обеспечения максимальной отзывчивости для клиентов, разрешая вызовы интерфейса во время задержки ввода-вывода. С другой стороны, объект, взаимодействующий с пользователем, может поддерживать потоки квартир для синхронизации входящих вызовов 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 создать объект в квартире вызывающего абонента, хотя маршалинг может по-прежнему возникать для перекрестных обратных вызовов или доступа из других квартир.
Связанные разделы