Может кто сталкивался с такой вот проблемой:
Есть WEB сервис (С++ .Net (1.1), IIS 6.0)
В WEB методе производится создание COM объекта и вызов метода.
inproc COM сервер написан на VB6 (STA модель).
Если вызывать COM непосредственно в текущем потоке WEB сервиса, а
он работает в MTA, то из-за того что COM сервер использует STA, получаем, что
вызов COM из другого потока aspnet_wp.exe синнхронизируется COM сервером, т.е.
пока не отработает один, другой не может создать COM объект.
Чтобы обойти это ограничение, COM объект создается в отдельном потоке STA.
Все начинает работать корректно, т.е. потоки разных клиентских запросов могут одновременно
создавать COM объекты, но — производительность WEB метода резко падает —
можно сказать в сотни раз. Когда COM объект создается в отдельном потоке, но в MTA, несмотря на то, что вызов маршалируется, тем не менее, время составляет к примеру 0.1 сек (всего).
Если же в STA, то 3 сек.
При попытке выяснить, где же тратится время, получается что-то непонятное —
время выполнение COM метода не меняется, все проходит быстро.
Но после выхода из функции потока проходят те самые 3 секунды, пока основной поток продолжит выполнение.
(основной поток ждет завершения дочернего (на Join()).
Можно не ждать окончания потока на Join(), а использовать другой метод ожидания готовности данных,
с поток пусть себе сам завершается. Или вообще его подвешивать, а при следующем заходе опять создавать новый.
Все начинает работать тоже быстро. Такое ощущение, что поток очень долго завершается.