Pergunta

Você pode explicar STA e MTA em suas próprias palavras?

Além disso, quais são tópicos do apartamento e eles dizem respeito apenas a COM? Se sim, porquê?

Foi útil?

Solução

O modelo de segmentação COM é chamado um modelo "apartamento", onde o contexto de execução do COM inicializado objetos está associada a um único segmento (Single Thread Apartment) ou muitos segmentos (multi Tópico apartamento). Neste modelo, um objeto COM, uma vez inicializado em um apartamento, é parte do que o apartamento para a duração do seu tempo de execução.

O modelo STA é usado para objetos COM que não são thread-safe. Isso significa que eles não lidar com a sua própria sincronização. Um uso comum é um componente UI. Então, se outro segmento necessidades de interagir com o objeto (como apertar um botão em um formulário), em seguida, a mensagem é codificado para o segmento STA. O Windows Forms sistema de mensagem de bombeamento é um exemplo disso.

Se o objeto COM pode lidar com sua própria sincronização então o modelo MTA podem ser usados ??onde vários segmentos estão autorizados a interagir com o objeto sem chamadas mobilizados.

Outras dicas

É tudo para baixo a como chamadas para objetos são manipulados, e quanto protecção de que necessitam. objetos COM pode pedir o tempo de execução para protegê-los contra a ser chamado por vários threads ao mesmo tempo; aqueles que não podem, potencialmente, ser chamado simultaneamente de segmentos diferentes, então eles têm de proteger seus próprios dados.

Além disso, também é necessário que o tempo de execução para evitar uma chamada de objeto COM de bloquear a interface do usuário, se uma chamada é feita a partir de um fio de interface do usuário.

Um apartamento é um lugar para objectos para viver, e eles contêm uma ou mais threads. O apartamento define o que acontece quando as chamadas são feitas. Chamadas para objetos em um apartamento será recebido e processado em qualquer segmento naquele apartamento, com a ressalva de que uma chamada por um fio já no apartamento direito é processado pelo próprio (ou seja, uma chamada direta para o objeto).

Threads pode ser tanto em um single-threaded Apartment (caso em que eles são o único segmento em que apartamento) ou em um compartimento com vários segmentos. Eles especificam que quando a thread inicializa COM para esse segmento.

O STA é principalmente para compatibilidade com a interface do usuário, que está ligada a um segmento específico. Uma STA recebe notificações de chamadas para processo ao receber uma mensagem de janela para uma janela oculta; quando faz uma chamada de saída, ele começa um loop de mensagem modal para evitar que outras mensagens de janela que está sendo processado. Você pode especificar um filtro de mensagens a ser chamado, de modo a que a sua aplicação pode responder a outras mensagens.

Por outro lado os tópicos MTA compartilhar um único MTA para o processo. COM pode iniciar um novo segmento de trabalho para lidar com uma chamada recebida, se não segmentos estão disponíveis, até um limite de piscina. Threads fazer chamadas de saída simplesmente bloquear.

Para simplificar, vamos considerar apenas objetos implementadas em DLLs, que anunciam no registro que eles suportam, definindo o valor ThreadingModel para a chave de sua classe. Existem quatro opções:

  • rosca principal (valor ThreadingModel não está presente). O objeto é criado no principal segmento interface do usuário do hospedeiro, e todas as chamadas são empacotados para esse segmento. A fábrica classe só será chamado nesse segmento.
  • Apartment. Isto indica que a classe pode ser executado em qualquer segmento do modo single-threaded. Se o segmento que cria é um segmento STA, o objeto será executado nesse segmento, caso contrário, será criado no STA principal - se não existir STA principal, um segmento STA será criado para ele. (Isto significa threads MTA que criam objetos apartamento será mobilizar todas as chamadas para um segmento diferente.) A fábrica de classe pode ser chamado simultaneamente por vários threads STA para que ele deve proteger seus dados internos contra isso.
  • Free. Isso indica uma classe projetado para executar no MTA. Será sempre carregar no MTA, mesmo criado por um segmento STA, que por sua vez significa chamadas do thread STA será comandada. Isso ocorre porque um objeto Free é geralmente escrito com a expectativa de que ele pode bloquear.
  • Both. Essas classes são flexíveis e de carga em qualquer apartamento que está criada. Eles devem ser escritos para caber ambos os conjuntos de requisitos, no entanto: eles devem proteger seu estado interno contra chamadas simultâneas, em caso eles são carregados na MTA, mas não deve bloquear, caso eles são carregados em uma STA

A partir do .NET Framework, basicamente, é só usar [STAThread] em qualquer segmento que cria UI. threads de trabalho deve usar o MTA, a menos que eles estão indo para usar componentes COM marcado-Apartment, caso em que o uso do STA para evitar mobilizar sobrecarga e problemas de escalabilidade se o mesmo componente é chamado de vários segmentos (como cada thread terá que esperar para o componente, por sua vez). É muito mais fácil ao redor se você usar um objeto COM separado por thread, se o componente está no STA ou MTA.

I encontrar as explicações existentes também algaravia. Aqui está a minha explicação na planície Inglês:

STA: Se um thread cria um objeto COM que é definido como STA (ao chamar CoCreateXXX você pode passar uma bandeira que define o objeto COM para o modo STA), então somente esta discussão pode acessar esse objeto COM (Isso é o que significa STA - Single Threaded Apartment), outro segmento tentando chamar métodos neste objeto cOM é sob o capô silenciosamente transformou em entrega de mensagens para o segmento que cria (possui) o objeto cOM. Isso é muito parecido com o fato de que apenas o segmento que criou um controle de interface do usuário pode acessá-lo diretamente. E este mecanismo destina-se a evitar bloqueio complicado / operações de desbloqueio.

MTA: Se um thread cria um objeto COM que é definido como MTA, em seguida, praticamente todos os thread pode chamar diretamente métodos sobre ele.

Isso é muito bonito a essência dele. Embora tecnicamente não são alguns detalhes que eu não mencionar, como no parágrafo a 'STA', o fio criador em si deve ser STA. Mas isso é praticamente tudo que você precisa saber para entender STA / MTA / NA.

STA (Single Threaded Apartment) é basicamente o conceito de que apenas um thread irá interagir com o seu código de cada vez. Chamadas em seu apartamento são empacotadas através de mensagens do Windows (usando um não-visível) janela. Isso permite que as chamadas sejam colocados em fila e esperar para operações para completar.

MTA (Multi-Threaded Apartment) é onde muitos segmentos podem funcionar ao mesmo tempo e a responsabilidade recai sobre você como o desenvolvedor para lidar com a segurança fio.

Há muito mais a aprender sobre enfiar modelos em COM, mas se você está tendo dificuldade para entender o que eles são, em seguida, eu diria que compreender o que o STA é e como funciona seria o melhor ponto de partida porque a maioria dos objetos COM são do STA.

Apartamento Threads, se um segmento vive no mesmo apartamento como o objeto que ele está usando, então é um segmento apartamento. Acho que este é apenas um conceito COM porque é só uma maneira de falar sobre os objetos e tópicos eles interagem com ...

Cada EXE quais hosts COM ou controles define OLE-lo do estado do apartamento. O estado apartamento é por STA padrão (e para a maioria dos programas deve ser STA).

STA - controla todas OLE por necessidade deve viver em um STA. meios STA que o seu COM-objeto deve ser sempre manipulados no segmento interface do usuário e não podem ser passados ??para outros tópicos (muito parecido com qualquer elemento da interface do usuário no MFC). No entanto, o programa ainda pode ter muitos fios.

MTA -. Você pode manipular o objeto COM em qualquer segmento em seu programa

Como o meu entendimento, o 'Apartment' é usado para proteger os objetos COM sejam questões multi-threading.

Se um objeto COM não é thread-safe, deve declará-lo como um objeto STA. Apenas a thread que cria pode acessá-lo. O fio criação deve declarar-se como um segmento STA. Sob o capô, as lojas de rosca a informação STA em suas TLS (armazenamento local de thread). Chamamos esse comportamento como que o segmento entra em um apartamento STA. Quando outros tópicos deseja acessar este objeto COM, ele deve organizar o acesso ao segmento de criação. Basicamente, o mecanismo de mensagens usa a linha criação de processar as chamadas in-bound.

Se um objeto COM é thread-safe, deve declará-lo como um objeto MTA. O objeto MTA pode ser acessado por múltiplas threads.

O código que dlls objeto chamadas COM (por exemplo, para ler arquivos de dados proprietários), pode funcionar bem em uma interface de usuário, mas pendurar misteriosamente de um serviço. A razão é que a partir de .Net 2.0 interfaces de usuário assumir STA (thread-safe), enquanto os serviços assumem MTA ((antes disso, serviços assumiu STA). Tendo que criar um segmento STA para todas as chamadas COM em um serviço pode adicionar uma sobrecarga significativa.

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