Respostas:
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).
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.
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
[STAThread]
?