Зачем мне использовать & # 8220; Both & # 8221; Модель COM-потока вместо & # 8220; Free & # 8221 ;?

StackOverflow https://stackoverflow.com/questions/1824397

Вопрос

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

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

Это было полезно?

Решение

Модель с обеими потоками

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

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

Поэтому, если вы считаете, что ваш компонент может быть вызван из STA (все COM-объекты VB6 являются STA), вы можете пометить модель потоков как " Both ".

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

Модель бесплатных потоков

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top