STAThread и многопоточность


из статьи MSDN о STAThread:

указывает, что модель потока COM для приложения является однопоточным квартирой (STA).

(Для справки, это все статьи.)

однопоточный апартамент... Ладно, это было выше моего понимания. Кроме того, я где-то читал, что если ваше приложение не использует com-взаимодействие, этот атрибут фактически ничего не делает. Так что именно он делает, и как это влияет на многопоточные приложения? Должны ли многопоточные приложения (которые включают в себя что-либо от любого, кто использует TimerS для асинхронных вызовов методов, а не только threadpools и т. п.) используйте MTAThread, даже если это "просто для безопасности"? Что на самом деле делают STAThread и MTAThread?

3 99

3 ответа:

Apartment threading-это концепция COM; Если вы не используете COM, и ни один из API, которые вы называете, не использует COM "под крышками", вам не нужно беспокоиться о квартирах.

Если вам нужно быть в курсе квартир, то детали можно получить сложно; вероятно, упрощенная версия заключается в том, что COM-объекты, помеченные как STA, должны запускаться в STAThread, а COM-объекты, помеченные MTA, должны запускаться в потоке MTA. Используя эти правила, COM может оптимизировать вызовы между этими различными объектами, избегая маршалинга, где это не нужно.

что это делает он гарантирует, что CoInitialize называется указание COINIT_APARTMENTTHREADED в качестве параметра. Если вы не используете какие-либо компоненты COM или элементы управления ActiveX, это не будет иметь никакого эффекта на вас вообще. Если вы это сделаете, то это очень важно.

элементы управления с квартирной резьбой являются фактически однопоточными, вызовы, сделанные к ним, могут быть обработаны только в квартире, в которой они были созданы.

еще несколько деталей из MSDN:

объекты, созданные в одном потоке apartment (STA) прием вызовов методов только из своей квартиры нить, так что вызовы сериализуются и поступают только на границах очереди сообщений (когда Функция Win32 PeekMessage или SendMessage называется).

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

когда объект, который настроен на бегите в нейтральную продетую нитку квартиру (NTA) вызывается потоком, который находится в либо STA или МТА, что нить трансферы в НТА. Если эта нить впоследствии вызывает CoInitializeEx, вызов завершается неудачно и возвращается RPC_E_CHANGED_MODE.

STAThread записывается перед основной функцией проекта C# GUI. Он ничего не делает, но позволяет создать один поток.