Хорошо, я подозреваю, что мне будет трудно даже выразить это словами, так как мое понимание COM и апартаментов не совсем подходит для работы; -)
У меня есть внутрипроцессный сервер / компонент COM (C ++), который оборачивает некоторый устаревший код. Из-за ограничений этого унаследованного кода мне нужно убедиться, что методы компонента COM:
- вызывается только в одном потоке.
- это всегда один и тот же поток для всех экземпляров сервера.
- (что я понял только позже) никаких повторных звонков.
Первые два я достиг, зарегистрировав сервер с ThreadingModel = "".
3-я проблема, с которой я даже удивился.
Сервер используется многопоточным клиентом, который я не могу контролировать. Он создает несколько экземпляров сервера / компонента в разных потоках и вызывает их метод DoSomething ().
Это приводит к выбору поведения зависания и сбоя, и я видел трассировки стека, содержащие два вызова DoSomething () как в потоке main-STA, но для разных экземпляров сервера.
Изначально я даже не думал, что это возможно, но теперь у меня есть частичное понимание, и мне нужно знать, если / как это можно предотвратить.
Мое чтение говорит о том, что мне может понадобиться использовать IMessageFilter каким-либо образом, но я не уверен, что это может быть сделано на стороне сервера, или это должен сделать клиент.
Кто-нибудь может помочь?
Обратите внимание, что я смотрю , чтобы посмотреть, есть ли какие-либо ответы на уровне COM , вместо того, чтобы искать предложения по изменению способа взаимодействия кода сервера с унаследованным кодом (например, путем запуска унаследованного). код в своем собственном потоке и реализация собственного (не COM) маршалинга вызовов из всех экземпляров сервера в этот поток).