Требуется ли маршалировать com-объект, поддерживающий модель потоков «Оба»? - PullRequest
2 голосов
/ 11 августа 2010

Нам предоставляется in-proc-сервер (.dll) с моделью потоков «Оба». Я заметил модель потоков в редакторе реестра. Так как мы знаем, что com-объект, созданный с помощью «Оба», примет модель потока потока вкоторый объект создан.Я создал объект в потоке STA, чтобы убедиться, что вызов com-объекта должен проходить только через один поток.я вызывал методы этих объектов из дочернего потока в сериализованном виде, где объект фактически создается в основном потоке (STA)

это будет иметь какие-либо побочные эффекты?получить любые ошибки и прекрасно работает, когда я использовал объект в дочернем потоке без какой-либо сортировки (GIT).

теперь я сомневаюсь, как это происходит.Google.пожалуйста, дайте мне краткое описание этого

в соответствии с моим пониманием, маршалинг объекта требуется, если объект поддерживает "STA", так ли это?здесь наш объект поддерживает «Оба».

Ответы [ 2 ]

2 голосов
/ 12 августа 2010

См. это очень хорошее объяснение . Будет ли использоваться сортировка, будет зависеть от того, находятся ли объект и вызывающая сторона в одной квартире. Если я правильно понимаю ваши слова, вы вызываете CoInitializeEx(), чтобы поместить поток в STA, тогда вы вызываете CoCreateInstance() из этого потока - объект будет создан в той же STA, поэтому исходный поток создателя будет связываться с ним напрямую. То, как другой поток будет использовать этот объект, будет зависеть от конфигурации квартиры. Из вашего вопроса неясно, вызывает ли другой поток CoInitializeEx() и как на него передается указатель объекта. Если вы просто передадите необработанный указатель, тогда не будет средств для включения сортировки.

Когда вы передаете указатель на другой поток, вы можете столкнуться с реальными проблемами. Во второй части вышеприведенной статьи говорится, что вы никогда не должны передавать необработанные указатели между квартирами . Однако, похоже, ваш случай является исключением из этого правила. Класс COM помечен как имеющий многопоточную модель Both, поэтому он должен быть полностью поточно-ориентированным, и поэтому его методы можно вызывать из нескольких потоков одновременно. Я не уверен в этом, но, похоже, ты в безопасности.

0 голосов
/ 12 августа 2010

Да, потому что вы создаете объект в одной квартире и вызываете методы в другой.Вы еще не столкнулись с побочными эффектами.Я думаю, потому что ваш объект прост (без обратных вызовов, точек подключения и т. Д.).Но это может быть изменено.

...