Usando componente COM legado em C # ambiente multithreaded
-
06-07-2019 - |
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?
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.