Хотя есть много вопросов о COM и STA/MTA (например, здесь), большинство из них говорит о приложениях с пользовательским интерфейсом. У меня, однако, есть следующая настройка:
- Консольное приложение, по умолчанию Multi-Threaded Apartment (Main() явно имеет атрибут
[MTAThread]
). - Основной поток генерирует некоторые рабочие потоки.
- Основной поток создает однопоточный COM-объект.
- Основной поток вызывает Console.ReadLine(), пока пользователь не нажмет "q", после чего приложение завершится.
Несколько вопросов:
- В многочисленных местах упоминается потребность в насосе сообщений для объектов COM. Мне нужно вручную создать сообщение-насос для основного потока, или CLR создаст его для меня в новом потоке STA, как предлагает этот вопрос?
- Чтобы убедиться, что CLR автоматически создает необходимую сантехнику, могу ли я затем использовать COM-объект из любого рабочего потока без необходимости явной синхронизации?
- Что из следующего лучше с точки зрения производительности:
- Пусть CLR позаботится о маршалинге и из COM-объекта.
- Явным образом создайте экземпляр объекта в отдельном потоке STA и передайте ему другой поток через, например, a
ConcurrentQueue
.