Зачем мне использовать модель «Оба» COM-потока вместо «Свободной»? - PullRequest
11 голосов
/ 01 декабря 2009

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

Теперь я понимаю, что возможность зарегистрировать мой объект как использующий "свободную" модель потоков является выгодной и, возможно, стоит заплатить цену, чтобы сделать ее полностью поточно-ориентированной. Но почему я хотел бы сделать все то же самое и зарегистрировать мой объект, используя вместо этого модель потоков «Оба»? В чем будет преимущество? Как выбрать между «Оба» и «Бесплатно»?

1 Ответ

20 голосов
/ 01 декабря 2009

Модель с двумя нитями

Основная причина пометки вашего компонента как поддерживающей модель многопоточности "Оба" заключается в повышении производительности при вызове компонента из однопотоковой квартиры (STA).

Если вы пометите свой компонент как MTA, а ваш компонент будет создан из STA, тогда ваш компонент будет создан в отдельной квартире MTA, а результирующий маршалинг между квартирами может снизить производительность настолько, чтобы свести на нет всю работу. положить в создание эффективного, свободно резьбового компонента ". Однако, если модель потоков вашего компонента помечена как «Оба», она будет создана внутри помещения объекта STA и получит прямой доступ.

Так что, если вы считаете, что ваш компонент может быть вызван из STA (все COM-объекты VB6 являются STA), вы можете пометить модель потоков как «Оба».

Хорошая статья базы знаний по Модели потоков OLE .

Бесплатная модель Threading

Возможно, вы захотите использовать модель потоков «Free», если ваш компонент использует другие компоненты, помеченные как «Free». Если ваш компонент был помечен как «Оба», то между компонентом «Оба», работающим в STA и MTA, может возникнуть чрезмерное переключение между квартирами. Как правило, старайтесь создать компонент как можно ближе к вызывающей стороне (т. Е. В той же квартире), одновременно функционируя при всех сценариях.

Еще одна ситуация, которая потребует маркировки вашего компонента как «Свободного», это если он явно блокируется (например, Thread.Sleep). Если компонент помечен как «Оба» и создан в STA, компонент блокирует рассылку сообщений STA.

Другие соображения и сценарии

Если вы планируете использовать компонент в IIS, то есть другие вещи, которые следует учитывать. Для IIS рекомендуется «Оба». Главным образом, чтобы избежать проблем с блокировкой компонентов Apartment, доступного доступа к COM + ObjectContext и того факта, что «свободные» потоковые компоненты используют контекст безопасности системы (если вам требуется доступ к контексту безопасности пользователя). См. Выбор модели потоков для компонентов в IIS для получения дополнительной информации о соображениях потоков IIS.

Другие вопросы, которые необходимо учитывать, - это поддержка COM + и поведение ваших компонентов, если они запускаются в COM +, а также указание и передача указателей интерфейса.

Отличная статья: Потоки COM и архитектура приложений в приложениях COM + . Он имеет фокус COM +, но также обсуждает COM. По вашему вопросу прочитайте раздел, озаглавленный «Рекомендации по моделированию потоков». Microsoft удалила оригинальную статью, поэтому я делаю ссылку на ее копию.

...