Pergunta

Eu tenho um problema de design interessante e esperava que todos pudessem fazer algumas sugestões. Estou usando C# e .NET 3.0

Eu tenho uma estrutura muito agradável e extensível, construída sobre o WCF que automatiza a configuração de pontos de extremidade e a criação de contratos. O sistema em que estou trabalhando pode ser executado de maneiras diferentes - os pontos de extremidade podem estar em outro lugar da Internet, executando em diferentes montagens na mesma caixa ou até mesmo em execução no mesmo processo. O WCF é ótimo para tornar tudo isso transparente, mas no último caso, gostaria de melhorar a eficiência:

Eu adoraria evitar a sobrecarga de serializar objetos que realmente não estão indo a lugar algum. Realmente não faz sentido fazer isso para se comunicar entre dois threads na mesma montagem. Ao mesmo tempo, gostaria de utilizar a estrutura baseada no WCF que já está em vigor, porque será muito mais fácil manter se não tivermos dois caminhos de comunicação separados, dependendo da configuração do sistema.

Meu primeiro pensamento foi usar ponteiros de objeto em um contexto inseguro - não combater a serialização, mas apenas serializar a quantidade mínima. Minha preocupação com isso é que, em mensagens assíncronas em ambientes em que o GC está sendo agressivo, a mensagem pode e provavelmente desaparecerá antes de termos a chance de desreferenciar o ponteiro contido nele, o que levaria a muitos problemas.

Meu próximo pensamento foi usar gchandles, mas não tenho certeza sobre o comportamento deles - se um gchandle não é mais referenciado, mas contém uma referência a um objeto gerenciado, ambos são limpos pelo GC, ou não? Estou preocupado em introduzir um enorme vazamento de memória usando -os, porque a chance de uma mensagem se perder é ótima e não poderemos chamar de graça (), e a documentação que posso encontrar é ... Falta .

Outro pensamento é usar a reflexão para analisar todos os objetos gerenciados, mas parece que a sobrecarga para isso seria enorme, e esse sistema deve ser o mais eficiente possível.

Portanto, em resumo, estou tentando enviar um objeto em um processo com o WCF sem serializar -o, o que, até onde eu sei, significa mantê -lo vivo, mesmo que ele não tenha referências temporariamente. Parece que deveria ser possível, mas me pergunto se estou tentando comer meu bolo e comê -lo também.

Muito obrigado pelo seu contributo!

Foi útil?

Solução

Eu investigaria o protocolo de transporte "NetNamedPipes" no WCF, projetado especificamente para a comunicação entre machinas, entre processos e que tem a menor sobrecarga possível (incluindo serialização binária rápida).

Marc

Outras dicas

Confira a ligação de transporte nulo neste artigo.

http://www.codeproject.com/kb/wcf/nulltransportforwcf.aspx

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