Какую модель использовать STA / MTA - PullRequest
3 голосов
/ 22 февраля 2010

Я пытаюсь создать COM-компонент, где он будет часто вызываться приложением Excel (Excel будет загружать COM при его инициализации), а другой процесс (скажем, procA) также отправляет (с высокой частотой) сообщения Windows в этот компонент. В настоящее время я реализовал COM как STA, однако я обнаружил, что, хотя COM занят обработкой сообщений от procA, пользовательский интерфейс Excel застревает.

Пожалуйста, помогите мне обойти эту проблему. Могу ли я просто создать простой оконный поток для обработки сообщений от procA, сохраняя COM как модель STA? Или мне нужно сделать COM как модель MTA, если да, пожалуйста, объясните, как с этим обращаться.

Спасибо

1 Ответ

1 голос
/ 22 февраля 2010

Переход на MTA требует от вас выполнения всех необходимых блокировок для защиты состояния вашего компонента. И это добавит накладные расходы на переключение потоков, поскольку пользовательский интерфейс Excel работает в определенном потоке, который будет блокировать 1 при вызове перекрестного потока в ваш компонент. Другой процесс уже влечет за собой перекрестные издержки, поэтому никаких реальных изменений там нет.

Вы можете избежать межпотоковых накладных расходов Excel, пометив модель компонента как модель потоков «Нейтральная» & mdash; она все еще может использоваться из любого потока, даже если она не привязана к существованию в MTA (т.е. все вызовы в процессе будут прямой, без ниток). Запишите его как свободный поток (все блокировки все еще необходимы), но просто измените регистрацию.

Учитывая все усилия, чтобы гарантировать, что ваш компонент является поточно-ориентированным, вы можете обнаружить, что нет никакого преимущества, если несколько вызовов в ваш компонент не могут действительно выполняться одновременно. Если вы просто берете блокировку на время каждого метода, вы ничего не сохраняете, будучи в STA. Более тонкая блокировка может дать преимущество, но вам необходим более подробный анализ возможного параллелизма, а затем профилирование, чтобы доказать, что вы смогли его достичь. Посмотрите на Закон Амдала , чтобы охватить эти вопросы.


1 Это очень упрощенно ... реальная ситуация довольно сложна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...