Каковы ограничения потока STA по сравнению с потоками MTA?

если мы сделаем поток STA, как это:Thread.SetApartmentState(STA); тогда он не может запустить код, помеченный

2 ответов


тогда он не может запустить код, помеченный атрибутом [MTAThread].

это не так. Тип квартиры является свойством потока, а не метода. Вы видите атрибут [STAThread], применяемый только к методу Main() программы .NET. Он определяет тип квартиры самого первого потока, который создается для запуска программы. Необходимо, потому что вы не можете вызвать SetApartmentState() после запуска потока. Помимо этого, атрибут не имеет это означает, что нить остается в STA на всю жизнь. Вы никогда не видите [MTAThread], потому что это значение по умолчанию.

поток, который является STA, имеет некоторые ограничения. Он никогда не может блокировать, потому что это заблокирует и часто блокирует любой код, который пытается вызвать метод объекта COM с потоком квартиры. И он должен перекачивать цикл сообщений, чтобы COM мог маршалировать вызов метода из другого потока. Маршалированные вызовы методов могут выполняться только тогда, когда поток "простаивает", а не занят выполнением кода. Цикл сообщений обеспечивает состояние "не занят".

требования на компоненте COM также. Он должен поддерживать маршалинг, либо ограничивая себя подмножеством типов, поддерживаемых автоматизацией, чтобы можно было использовать стандартный маршаллер. Или путем предоставления пары прокси / заглушка для пользовательского маршалинга. The HKCR\Interface\{iid}\ProxyStubClsid32 раздел реестра определяет, как выполняется маршалинг.

совместное использование объекта с резьбой квартиры между STA и потоком MTA явно поддерживается. Поток STA должен создать его, любые вызовы потока MTA (или других потоков STA) маршалируются. Что гарантирует, что компонент только когда-либо видит вызовы, сделанные в одном потоке, обеспечивая тем самым безопасность потока. Дополнительная блокировка не требуется.

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


Я не думаю, что это имеет значение, если вы не используете COM. Если вы это сделаете, то в некоторых случаях, COM-объекты могут быть доступны только из одного или другого типа резьбы. Если COM-объект работает в обеих квартирах, попробуйте выполнить тесты производительности. Или читайте о com-квартирах на MSDN. Но я не думаю, что это имеет значение для производительности, это скорее выбор дизайна или что-то в этом роде.