Как зависят вызовы COM с Neutral Appartment от установленных аттрибутов STA/MTA?
От: LWhisper  
Дата: 18.10.12 12:05
Оценка:
Всем привет!

Есть COM-объект. При регистрации в реестре, ThreadModel указана, как Neutral.

Создаётся он в главном потоке приложения. Вызывается из других потоков.

Проблема: если у главного потока (метода main) стоит аттрибут STAThread, сообщения до этого объекта не доходят до тех пор, пока не будет вызван thread.Join();
Если установить MTAThread, сообщения замечательно отправляются.

Вопрос: почему?

Здесь: http://rsdn.ru/forum/dotnet/3605409
Автор: vmpire
Дата: 17.11.09

Нашёл доходчивые объяснения по аппартментам. К сожалению, Neutral не рассматривался. Зато по нему в сети куча очень мутной информации. Вроде бы, он вообще не должен зависеть от аппартмента вызывающего потока... а как насчёт аппартмента создающего?

Вот здесь есть табличка:
http://msdn.microsoft.com/en-us/library/ms681753%28VS.85%29.aspx

И Neutral'ы разделены на два: STA и MTA.

Для STA: Created in host single-threaded apartment for this thread.
Для MTA: Created in host single-threaded apartment.

То есть, чем-то всё-таки различаются?

Вот здесь:
www.codeguru.com/cpp/com-tech/activex/apts/article.php/c5529/Understanding-COM-Apartments-Part-I.htm
Весьма подробно разжевано, но из него выходит, что разницы нет, а тесты показывают, что разница есть. =\

Но опять же — там про вызовы, а момент создания как-то обошли.

Заранее спасибо за любую помощь!
com threads threadmodel appartments
Re: Как зависят вызовы COM с Neutral Appartment от установленных аттрибутов STA/
От: LWhisper  
Дата: 18.10.12 12:57
Оценка:
Поправка — через 5-10 минут сообщения всё-таки доходят. Но это неадекватное время. В случае с MTAThread у создающего потока — почти мгновенно.
Re: Как зависят вызовы COM с Neutral Appartment от установленных аттрибутов STA/
От: LWhisper  
Дата: 22.10.12 07:34
Оценка:
UP. Всё ещё актуально.
Re: Как зависят вызовы COM с Neutral Appartment от установленных аттрибутов STA/
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 22.10.12 18:54
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW><skipped>


Нейтральные объекты наследуют апартмент того потока, который создаёт объект. В случае STA для доставки вызовов используется цикл выборки сообщений (если он есть) и alertable wait.
[КУ] оккупировала армия.
Re[2]: Как зависят вызовы COM с Neutral Appartment от установленных аттрибутов S
От: LWhisper  
Дата: 23.10.12 07:46
Оценка:
Здравствуйте, koandrew, Вы писали:

K>Здравствуйте, LWhisper, Вы писали:


LW>><skipped>


K>Нейтральные объекты наследуют апартмент того потока, который создаёт объект. В случае STA для доставки вызовов используется цикл выборки сообщений (если он есть) и alertable wait.


Спасибо!
Re[2]: Как зависят вызовы COM с Neutral Appartment от установленных аттрибутов S
От: TK Лес кывт.рф
Дата: 23.10.12 08:19
Оценка:
Здравствуйте, koandrew, Вы писали:

K>Нейтральные объекты наследуют апартмент того потока, который создаёт объект. В случае STA для доставки вызовов используется цикл выборки сообщений (если он есть) и alertable wait.


Что значит наследуют апартмент? Есть отдельный NTA апартмент который создается один на процесс. Максимум, что можно унаследовать это synchronization context — в этом случае, доступ к может быть сериализован...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Как зависят вызовы COM с Neutral Appartment от установленных аттрибутов S
От: LWhisper  
Дата: 23.10.12 10:02
Оценка:
K>>Нейтральные объекты наследуют апартмент того потока, который создаёт объект. В случае STA для доставки вызовов используется цикл выборки сообщений (если он есть) и alertable wait.
TK>Что значит наследуют апартмент? Есть отдельный NTA апартмент который создается один на процесс. Максимум, что можно унаследовать это synchronization context — в этом случае, доступ к может быть сериализован...

Ну вот, всё вернулось на круги своя. Я вновь не понимаю, что происходит. :D
Если верить докам, действительно создаётся NTA-аппартмент, и вызовы, что из STA, что из MTA проходят через Proxy различной степени тяжести... а за отправку сообщений всё равно отвечает поток, создавший объект. =\ Или всё, что связано с NTA касается только вызовов и к отправке сообщений никакого отношения не имеет?
Re[4]: Как зависят вызовы COM с Neutral Appartment от установленных аттрибутов S
От: TK Лес кывт.рф
Дата: 23.10.12 19:19
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Ну вот, всё вернулось на круги своя. Я вновь не понимаю, что происходит. :D

LW>Если верить докам, действительно создаётся NTA-аппартмент, и вызовы, что из STA, что из MTA проходят через Proxy различной степени тяжести...

На страничке http://msdn.microsoft.com/en-us/library/ms681753%28VS.85%29.aspx колонка apartment означает STA Apartment. Т.е. Если вызов в NTA пришел из STA апартамента и мы создаем STA объект то, создан он будет в STA апартаменте текущего потока (что логично).

Про прокси различной степени тяжести — зависит от контекста. Контекст может быть и не рентабельным — т.е пока первый вошедший в него поток не вышел то, остальные могут просто ждать на входе.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.