Однопоточные квартиры против многопоточных квартир [дублировать]
-
20-08-2019 - |
Вопрос
Возможный Дубликат:
Не могли бы вы объяснить 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.