Pergunta

De acordo com o este artigo se eu registrar meu objeto COM com qualquer um "Ambos" ou "livre" modelo de segmento que objeto deve ser completamente thread-safe. Especificamente todos os acessos a variáveis ??partilhadas globais devem ser sincronizados e todos os acessos a variáveis ??membros também devem ser sincronizados. Isso é um monte de esforço.

Agora eu entendo que ser capaz de registrar meu objeto como a utilização de "Livre" modelo de segmento é vantajoso e pode valer a pena pagar o preço de torná-lo totalmente thread-safe. Mas por que eu iria querer fazer tudo ao mesmo e registrar meu objeto usando "Ambos" modelo de segmento em vez disso? Qual seria a vantagem? Como faço para escolher entre "Tanto" e "gratuito"?

Foi útil?

Solução

Ambos Threading Model

A principal razão para a marcação de seu componente de apoio modelo de segmentação "Tanto" é para melhorias de desempenho quando o componente está sendo chamado de um Single Threaded Apartment (STA).

Se você marcar a sua componente como MTA e seu componente é criado a partir de uma STA, em seguida, o componente será criado em um apartamento MTA separado e o 'resultante inter-apartamento de empacotamento pode degradar o suficiente desempenho para anular toda a colocar o trabalho em fazer um eficiente, componente de segmentação livre' . No entanto, se modelo de segmentação do seu componente é marcado como "Ambos", em seguida, ele será criado dentro do apartamento do objeto STA e acessados ??diretamente.

Então, se você acha que o seu componente pode ser chamado de dentro de um STA (todos os objetos VB6 COM são STA) que você pode querer marcar o modelo de segmentação como "Ambos".

Um artigo de boa KB on OLE Threading modelos .

Free Threading Model

Você pode querer usar um modelo thread "gratuito" se o seu componente usa outros componentes que são marcados como "Livre". Se o componente foi marcado como "Ambos", então não poderia ser excessiva comutação apartamento entre o "Ambos" running componente no STA e MTA. Como regra geral, tente criar o componente mais próximo possível do chamador quanto possível (ou seja, mesmo apartamento), enquanto funcionando corretamente em todos os cenários.

Outra situação que justificaria marcando seu componente como "Livre" é se explicitamente blocos (por exemplo Thread.Sleep). Se o componente é marcado como "Ambos" e instanciado em um STA, em seguida, o componente iria bloquear a bomba mensagem STA.

Outras considerações e cenários

Se você está pensando em usar o componente no IIS, em seguida, há outras coisas a considerar. Para o IIS, "Tanto" é a configuração recomendada. Principalmente para evitar problemas de bloqueio com Apartamento com rosca componentes, o acesso performance para COM + ObjectContext eo fato de que "livre" rosca componentes usam o contexto de segurança do sistema (se você precisar de acesso ao contexto de segurança do usuário). Consulte Selecionando um modelo de Threading de componentes no IIS para mais informações sobre o IIS enfiando considerações.

Outras coisas a considerar são COM + suporte e como seus componentes se comportam, se eles são executados no COM + e se ponteiros interface são passados ??e armazenados.

Um excelente artigo é COM threading e arquitetura de aplicativos em COM + Applications . Ele tem uma COM + foco, mas também discute COM. Para a sua pergunta, leia a seção intitulada "Recomendações Threading Model". Microsoft removeu o artigo original, então eu estou ligando para uma cópia.

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