Зачем использовать "Both" COM-модель для потоковой передачи вместо "Free"?

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

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

Ответ 1

Обе модели Threading

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

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

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

Хорошая статья в KB на OLE Threading Models.

Бесплатная версия Threading Model

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

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

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

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

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

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