Из статьи MSDN о STAThread:
Указывает, что модель потоков COM для приложения является однопоточным подразделением (STA).
(Для справки, это вся статья .)
Однопоточная квартира ... Ладно, это перебило меня. Кроме того, я где-то читал, что если ваше приложение не использует COM-взаимодействие, этот атрибут вообще ничего не делает. Так что именно он делает и как влияет на многопоточные приложения? Должны ли многопоточные приложения (которые включают в себя все, от тех, кто использует Timer
s до вызовов асинхронных методов, а не только пулы потоков и т.п.) использовать MTAThread, даже если это «на всякий случай»? Что на самом деле делают STAThread и MTAThread?
источник
Что это значит, это гарантирует, что
CoInitialize
это вызвано указанием COINIT_APARTMENTTHREADED в качестве параметра. Если вы не используете какие-либо компоненты COM или элементы управления ActiveX, это никак не повлияет на вас. Если да, то это критично.Элементы управления, которые являются многопоточными, фактически являются однопоточными, их вызовы могут обрабатываться только в том отделе, в котором они были созданы.
Еще немного подробностей из MSDN:
источник
CoInitialize()
в ответ наSTAThread
атрибут /ApartmentState
? Примечание: статья в MSDN находится здесь: функция CoInitializeEx .CoInitialize()
внутренних целей ? Я проследил атрибут STAThread до конца, но след остыл (я не могу найти источникThread::SetApartment
). Документирован ли где-нибудь класс Thread из thread.h (COM thread.h)? Это MFC, ATL или что-то еще?STAThread написан перед основной функцией проекта графического интерфейса C #. Он ничего не делает, но позволяет программе создать единственный поток.
источник