Есть COM-объект. При регистрации в реестре, ThreadModel указана, как Neutral.
Создаётся он в главном потоке приложения. Вызывается из других потоков.
Проблема: если у главного потока (метода main) стоит аттрибут STAThread, сообщения до этого объекта не доходят до тех пор, пока не будет вызван thread.Join();
Если установить MTAThread, сообщения замечательно отправляются.
Нашёл доходчивые объяснения по аппартментам. К сожалению, Neutral не рассматривался. Зато по нему в сети куча очень мутной информации. Вроде бы, он вообще не должен зависеть от аппартмента вызывающего потока... а как насчёт аппартмента создающего?
Нейтральные объекты наследуют апартмент того потока, который создаёт объект. В случае STA для доставки вызовов используется цикл выборки сообщений (если он есть) и alertable wait.
Здравствуйте, koandrew, Вы писали:
K>Здравствуйте, LWhisper, Вы писали:
LW>><skipped>
K>Нейтральные объекты наследуют апартмент того потока, который создаёт объект. В случае STA для доставки вызовов используется цикл выборки сообщений (если он есть) и alertable wait.
Спасибо!
Re[2]: Как зависят вызовы COM с Neutral Appartment от установленных аттрибутов S
Здравствуйте, koandrew, Вы писали:
K>Нейтральные объекты наследуют апартмент того потока, который создаёт объект. В случае STA для доставки вызовов используется цикл выборки сообщений (если он есть) и alertable wait.
Что значит наследуют апартмент? Есть отдельный NTA апартмент который создается один на процесс. Максимум, что можно унаследовать это synchronization context — в этом случае, доступ к может быть сериализован...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Как зависят вызовы COM с Neutral Appartment от установленных аттрибутов S
K>>Нейтральные объекты наследуют апартмент того потока, который создаёт объект. В случае STA для доставки вызовов используется цикл выборки сообщений (если он есть) и alertable wait. TK>Что значит наследуют апартмент? Есть отдельный NTA апартмент который создается один на процесс. Максимум, что можно унаследовать это synchronization context — в этом случае, доступ к может быть сериализован...
Ну вот, всё вернулось на круги своя. Я вновь не понимаю, что происходит. :D
Если верить докам, действительно создаётся NTA-аппартмент, и вызовы, что из STA, что из MTA проходят через Proxy различной степени тяжести... а за отправку сообщений всё равно отвечает поток, создавший объект. =\ Или всё, что связано с NTA касается только вызовов и к отправке сообщений никакого отношения не имеет?
Re[4]: Как зависят вызовы COM с Neutral Appartment от установленных аттрибутов S
Здравствуйте, 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 апартаменте текущего потока (что логично).
Про прокси различной степени тяжести — зависит от контекста. Контекст может быть и не рентабельным — т.е пока первый вошедший в него поток не вышел то, остальные могут просто ждать на входе.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.