Pergunta

Eu tenho componente COM legado, e minha missão é serviço web de escrita que envolvem o COM e permitir chamadas sem bloqueio simultâneos.

Em primeiro lugar, porque o próprio objeto COM é apátrida, eu decidi usar o atributo [ThreadStatic] para cada thread terá sua própria instância do objeto COM para evitar o uso de bloqueio {} declaração e permitir o processamento simultâneo reais , mas parece que todas as chamadas ainda procceeded síncrona.

Eu escrevi um código de teste que executa um método do síncrona componente COM por {} loop, e depois acrescentou segundo segmento que fazendo exatamente o mesmo, mas para outra instância do objeto COM, e não vi mudanças, chamadas X sempre consumir Y timespan, não importa de tópicos contar. É como há um bloqueio estática ou algo assim ...

Apesar disso, os processos separados podem processar cada uma chamada simultaneamente para real. O que impede de segmentos separados para se comportam da mesma?

O que posso fazer para permitir chamadas simultâneas reais para o componente COM?

Foi útil?

Solução

COM é enfiar consciente e vai honrar o modelo de segmentação solicitada pelo coclass. Ela publica seus requisitos de segmentação com o valor ThreadingModel no registro. Se ele é definido como "Apartment" (ou falta), COM irá certificar-se todas as chamadas de método são feitas de um único apartamento rosca, retornando um proxy para as interfaces que você QI. O proxy garante que a chamada é empacotado para o segmento correto.

Você pode enganar e usar o ponteiro de interface que você tem quando você criou o coclass em um segmento STA e fazer chamadas sem empacotamento. Dado que o coclass já disse que não é capaz de multi-threading, isso é muito improvável que funcione corretamente. Você vai estado interno apenas aleatoriamente corrupto.

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