И опять вызов COM из WEB сервиса
От: kka77  
Дата: 17.09.08 06:36
Оценка:
Может кто сталкивался с такой вот проблемой:
Есть 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()).
Re: И опять вызов COM из WEB сервиса
От: kka77  
Дата: 18.09.08 10:41
Оценка:
Можно не ждать окончания потока на Join(), а использовать другой метод ожидания готовности данных,
с поток пусть себе сам завершается. Или вообще его подвешивать, а при следующем заходе опять создавать новый.
Все начинает работать тоже быстро. Такое ощущение, что поток очень долго завершается.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.