Какова цель многопоточных квартир? - PullRequest
1 голос
/ 03 апреля 2019

Я понимаю причину STA, но на самом деле не вижу причины для MTA.

COM-объект может быть загружен без каких-либо квартир, верно?Это означает, что он уже способен принимать вызовы асинхронно, поскольку никто не ставит никаких ограничений.

Где я ошибаюсь?

1 Ответ

1 голос
/ 05 апреля 2019

Во-первых, ваше предположение неверно: COM-объект не может быть создан вне любой квартиры. Обычно поток должен создавать COM-объекты только в том случае, если он ранее назывался CoInitialize или CoInitializeEx, который размещает его в квартире. В противном случае создание обычно не удастся. Существует крайний случай неявной многопоточной квартиры (если другой поток того же процесса инициализировал ее), но даже тогда вы были бы в MTA, просто ненадежным и трудным для отладки способом. COM-объект никогда не существует, не находясь в квартире.

Причина, по которой вы хотите MTA, заключается в том, что это не обязательно единственная квартира. Процесс может иметь один MTA и произвольно много STA. Звонки между MTA и любой из STA все еще должны быть упорядочены; в противном случае один из потоков MTA мог бы вызывать поток STA небезопасным способом.

Фактически наличие хотя бы одной STA является правилом, а не исключением: пользовательский интерфейс хочет жить в STA, потому что он зависит от сообщений (например, из-за щелчков мыши и т. Д.), Которые должны обрабатываться последовательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...