Однопоточные квартиры против многопоточных квартир [дублировать]

StackOverflow https://stackoverflow.com/questions/485086

Вопрос

Возможный Дубликат:
Не могли бы вы объяснить STA и MTA?

Все потоки ThreadPool находятся в многопоточном хранилище.

--Согласно MSDN

Что это значит?Меня действительно беспокоит, в чем разница между многопоточной и однопоточной квартирной моделью.Или что означает модель квартиры?Я прочитал об этом MSDN, и на самом деле это не имеет для меня смысла.Я думаю, у меня может быть идея, но я думал, что кто-нибудь здесь мог бы объяснить это простым английским языком.

Спасибо, Энтони Ди

Обновление 1

Нашел это Не могли бы вы объяснить STA и MTA?

Кто-нибудь может быть более описательным?

Обновление 2

Я также ищу ответ о том, как это применимо к пулу потоков, и на что мне нужно обратить внимание в связи с этим.

Это было полезно?

Решение

STA (однопоточная квартира) и MTA (многопоточная квартира) связаны с КОМ.Компоненты COM могут быть сконструированы так, чтобы к ним мог получить доступ один поток, и в этом случае они размещаются в STA, или они могут быть сделаны внутренне потокобезопасными и размещены в MTA.Процесс может иметь только один MTA, но множество STA.Если вы собираетесь использовать только COM-компоненты, все, что вам действительно нужно знать, это то, что вы должны сопоставить apartment с компонентом, иначе произойдут неприятные вещи.

Другие советы

На самом деле STA и MTA оказывают влияние на .NET-код.Смотрите запись в блоге Криса Брумме для получения более подробной информации, чем вам, вероятно, нужно:

https://devblogs.microsoft.com/cbrumme/apartments-and-pumping-in-the-clr/

Действительно важно понимать, как STAs перекачивает сообщения в .NET.Это действительно имеет последствия.

Если вашему COM-объекту необходимо верить, что он находится в однопоточной среде, используйте STA.Вам гарантируется, что создание и все вызовы будут выполняться одним и тем же потоком.Вы можете безопасно использовать локальное хранилище потоков, и вам не нужно использовать критические разделы.

Если ваш COM-объект может быть доступен многим потокам одновременно, используйте MTA - никаких защитных устройств установлено не будет.

Как указывали другие, обычно это оказывает незначительное влияние на приложения .NET.

Однако имейте в виду, что тестовый узел Microsoft, используемый для модульных тестов, фактически реализован в STA, что означает, что существуют ограничения на то, что вы можете делать в модульном тестировании.Например, вы не можете выполнить WaitAll на WaitHandle в модульном тестировании вы используете тестовый хост Microsoft.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top