STAThread и многопоточность

102
задан Daniel A. White 7 August 2014 в 12:54
поделиться

2 ответа

Поточная обработка квартиры является понятием COM; если Вы не используете COM, и ни одни из API Вы называете использование COM "под покрытиями", тогда Вы не должны волноваться о квартирах.

, Если действительно необходимо знать о квартирах, тогда детали могут добраться , немного усложнил ; вероятно упрощенная версия - то, что COM-объекты, теговые как STA, должны быть выполнены на STAThread, и отмеченный MTA COM-объектов должен быть выполнен на потоке MTA. Используя эти правила, COM может оптимизировать вызовы между этими различными объектами, избежав маршалинга, где это не необходимо.

59
ответ дан Bruce 24 November 2019 в 04:34
поделиться

Что это делает это, это гарантирует, что CoInitialize назван, определив COINIT_APARTMENTTHREADED как параметр. Если Вы не будете использовать COM-компонентов или элементов управления ActiveX, то это не будет иметь никакого эффекта на Вас вообще. Если Вы делаете тогда, это довольно крайне важно.

Средства управления, которые являются поточной квартирой, являются эффективно единственными, распараллелил, вызовы, выполненные им, могут только быть обработаны в квартире, в которой они были созданы.

еще Некоторая деталь из MSDN:

Объекты, созданные в однопоточной квартире (STA), получают вызовы метода только от потока их квартиры, таким образом, вызовы сериализируются и прибывают только в границы очереди сообщений (когда функция Win32 PeekMessage или SendMessage вызвана).

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

, Когда объект, который настроен для выполнения в нейтральной потоковой квартире (NTA), называет поток, который находится или в STA или в MTA, тот поток передает NTA. Если этот поток впоследствии называет CoInitializeEx, сбои вызова и возвращает RPC_E_CHANGED_MODE.

3
ответ дан 1800 INFORMATION 24 November 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: