O que o [STAThread] faz?

293

Estou aprendendo C # 3.5 e quero saber o que [STAThread]faz em nossos programas?

odiseh
fonte

Respostas:

240

A STAThreadAttributeé essencialmente um requisito para a bomba de mensagem do Windows para se comunicar com componentes COM. Embora o Windows Forms central não use COM, muitos componentes do sistema operacional, como as caixas de diálogo do sistema, usam essa tecnologia.

O MSDN explica o motivo com mais detalhes:

STAThreadAttribute indica que o modelo de encadeamento COM para o aplicativo é um apartamento de thread único. Este atributo deve estar presente no ponto de entrada de qualquer aplicativo que use o Windows Forms; se for omitido, os componentes do Windows podem não funcionar corretamente. Se o atributo não estiver presente, o aplicativo usará o modelo de apartamento multithread, que não é suportado pelo Windows Forms.

Esta postagem no blog ( por que o STAThread é necessário? ) Também explica muito bem o requisito. Se você deseja uma visão mais detalhada de como o modelo de encadeamento funciona no nível CLR, consulte este artigo da MSDN Magazine de junho de 2004 (arquivado, abril de 2009).

Noldorin
fonte
1
Alguma idéia de por que o CompactFramework não suporta [STAThread]?
Bdb28
1
stackoverflow.com/questions/4154429/apartmentstate-for-dummies, esta resposta é bastante compreensível para mortais como eu. Adicionado apenas para referência aqui
Barış Akkurt
41

Diz ao compilador que você está em um modelo Single Thread Apartment. Isso é uma coisa ruim do COM, geralmente é usado para Windows Forms (GUI), pois usa o Win32 para seu desenho, que é implementado como STA. Se você estiver usando algo que é modelo STA a partir de vários threads, obterá objetos corrompidos.

É por isso que você precisa invocar o Gui a partir de outro thread (se você tiver feito alguma codificação de formulários).

Basicamente, não se preocupe, basta aceitar que os threads da GUI do Windows sejam marcados como STA, caso contrário, coisas estranhas acontecem.

Spence
fonte
2
STAThread não tem nada a ver com o requisito de chamar o encadeamento principal ao acessar a GUI. Isso se deve simplesmente à natureza da bomba de mensagens do Windows e não pode ser evitado de maneira mais geral em aplicativos multithread.
Noldorin
3
Realmente, trata-se apenas de lidar com componentes COM, como caixas de diálogo do SO e componentes de terceiros.
Noldorin
3
O Win32 não carrega nenhum conceito de apartamentos de encadeamento, seu COM que introduz o conceito. O COM "re-executa" o que era um sistema independente de thread (a bomba de mensagens do Windows) como um meio de sincronizar / serializar a execução de código nos apartamentos do COM.
AnthonyWJones
1
Apenas aceite que os tópicos do windows gui devem ser marcados como STA, caso contrário, coisas estranhas acontecem. :))))))
Nipuna
1
@Noldorin "requisito para chamar o thread principal" - isso não é tecnicamente um requisito . Exceções de thread cruzado não ocorrem fora do depurador. Ref: stackoverflow.com/questions/3972727/… . Não estou dizendo que você não deve resolver esse problema!
Shiv
31

O STAThreadAttribute marca um thread para usar o Single-Threaded COM Apartment se COM for necessário. Por padrão, o .NET não inicializa o COM. É somente quando COM é necessário, como quando um objeto COM ou Controle COM é criado ou quando é necessário arrastar e soltar, que COM é inicializado. Quando isso acontece, o .NET chama a função CoInitializeEx subjacente, que recebe um sinalizador indicando se deve ingressar no thread em um apartamento com vários threads ou com um único thread.

Leia mais informações aqui (Arquivado, junho de 2009)

e

Por que o STAThread é necessário?

rahul
fonte