Do artigo do MSDN sobre STAThread:
Indica que o modelo de threading COM para um aplicativo é single-threaded apartment (STA).
(Para referência, este é o artigo completo .)
Apartamento single-threaded ... OK, isso passou pela minha cabeça. Além disso, li em algum lugar que, a menos que seu aplicativo use interoperabilidade COM, esse atributo na verdade não faz nada. Então, o que exatamente ele faz e como afeta os aplicativos multithread? Os aplicativos multithread (que inclui qualquer coisa, desde qualquer pessoa usando Timer
s até chamadas de método assíncronas, não apenas threadpools e similares) devem usar MTAThread, mesmo que seja 'apenas para segurança'? O que STAThread e MTAThread realmente fazem?
fonte
O que faz, ele garante que
CoInitialize
seja chamado especificando COINIT_APARTMENTTHREADED como o parâmetro. Se você não usar nenhum componente COM ou controle ActiveX, ele não terá nenhum efeito sobre você. Se você fizer isso, será crucial.Os controles com thread de apartamento são efetivamente com thread único; as chamadas feitas a eles só podem ser processadas no apartamento em que foram criados.
Mais alguns detalhes do MSDN:
fonte
CoInitialize()
em resposta aoSTAThread
atributo /ApartmentState
? Observação: o artigo no MSDN está aqui: função CoInitializeEx .CoInitialize()
internamente? Rastreei o Atributo STAThread todo o caminho até lá, mas a trilha esfriou (não consigo encontrar a fonteThread::SetApartment
). A classe Thread de thread.h (o thread COM.h) está documentada em algum lugar? É MFC, ATL ou outra coisa?STAThread é escrito antes da função principal de um projeto C # GUI. Ele não faz nada, mas permite que o programa crie um único thread.
fonte