Pergunta

A partir do artigo do MSDN sobre STAThread:

Indica que o modelo de segmentação COM de um aplicativo é single-threaded apartment (STA).

(Para referência, que é todo o artigo .)

apartamento-threaded único ... OK, que passou por cima da minha cabeça. Além disso, eu li em algum lugar que a menos que seu aplicativo usa interoperabilidade COM, este atributo na verdade não faz nada em tudo. Então, o que exatamente ele faz, e como isso afeta aplicativos multithreaded? Should multithreaded aplicações (que inclui nada de ninguém usando Timers a chamadas de método assíncrono, não apenas threadpools e similares) use MTAThread, mesmo que seja 'apenas para ser seguro'? O que STAThread e MTAThread realmente fazer?

Foi útil?

Solução

Apartment threading é um conceito COM; Se você não estiver usando COM, e nenhuma das APIs que você chama de uso COM "sob as cobertas", então você não precisa se preocupar com apartamentos.

Se você precisa estar ciente de apartamentos, em seguida, os detalhes pode obter um pouco complicado ; uma versão provavelmente-simplista é que COM objetos marcados como STA deve ser executado em um STAThread, e COM objetos marcados MTA deve ser executado em um thread MTA. Usando estas regras, COM pode otimizar chamadas entre esses diferentes objetos, evitando empacotamento, onde não é necessário.

Outras dicas

O que faz ele garante que CoInitialize é chamado especificando COINIT_APARTMENTTHREADED como parâmetro. Se você não usar quaisquer componentes COM ou controles ActiveX que não terá nenhum efeito sobre você em tudo. Se o fizer, então é meio crucial.

controles que são apartamento rosca são efetivamente único segmento, as chamadas feitas para eles só podem ser processados ??no apartamento que eles foram criados em.

Alguns mais detalhes do MSDN:

Os objetos criados em um single-threaded apartamento (STA) receber chamadas de método apenas a partir de fio de seu apartamento, então chamadas são serializados e chegar única em fronteiras de mensagem-fila (quando o Win32 função ou PeekMessage SendMessage é chamado).

Os objetos criados em um segmento COM num multithread apartamento (MTA) deve ser capaz de receber chamadas de método de outros tópicos a qualquer momento. Você poderia tipicamente alguma forma de implementar controle de concorrência em um de vários segmentos código do objeto usando Win32 primitivos de sincronização, tais como seções críticas, semáforos, ou mutexes para ajudar a proteger o objeto de dados.

Quando um objecto que está configurado para executar no apartamento rosca neutro (NTA) é chamado por um thread que está em quer um STA ou o MTA, que rosca transferências para o NTA. Se esta discussão posteriormente chama CoInitializeEx, o chamada falha e retorna RPC_E_CHANGED_MODE.

STAThread está escrito antes que a função principal de um projeto C # GUI. Ele não faz nada, mas permite que o programa para criar um único segmento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top