Pergunta

Tenho dois processos não relacionados que usam assemblies .NET como plug-ins.No entanto, qualquer um dos processos pode ser iniciado/interrompido a qualquer momento.Não posso confiar que um processo específico seja o servidor.Na verdade, pode haver múltiplas cópias em execução de um dos processos, mas apenas de um do outro.

Inicialmente implementei uma solução baseada em Este artigo.No entanto, isso exige que aquele que implementa o servidor esteja em execução antes do cliente.

Qual é a melhor maneira de implementar algum tipo de notificação ao servidor quando o(s) cliente(s) estiver(em) sendo executado(s) primeiro?

Foi útil?

Solução

Usar memória compartilhada é mais difícil porque você terá que gerenciar o tamanho do buffer de memória compartilhada (ou apenas pré-alocar o suficiente).Você também terá que gerenciar manualmente as estruturas de dados colocadas lá.Depois de testá-lo e funcionar, será mais fácil de usar e testar devido à sua simplicidade.

Se você seguir a rota remota, poderá usar o IpcChannel em vez dos canais TCP ou HTTP para uma comunicação de sistema único usando Pipes Nomeados. http://msdn.microsoft.com/en-us/library/4b3scst2.aspx.O problema com esta solução é que você precisará criar uma solução do tipo registro (na memória compartilhada ou em algum outro armazenamento persistente) na qual os processos possam registrar seus terminais.Dessa forma, ao procurá-los, você poderá encontrar uma maneira de consultar todos os endpoints que estão em execução no sistema e encontrar o que procura.Os benefícios de usar o Remoting são que a serialização e a chamada de método são bastante diretas.Além disso, se você decidir migrar para várias máquinas em uma rede, basta girar o botão para usar os canais de rede.A desvantagem é que a comunicação remota pode ser frustrante, a menos que você separe claramente o que são chamadas "remotas" das chamadas "locais".

Não sei muito sobre o WCF, mas também pode valer a pena investigar.O sentido da aranha diz que provavelmente tem uma solução mais elegante para este problema...talvez.

Alternativamente, você pode criar um processo "servidor" que seja separado de todos os outros processos e que seja iniciado (use um Mutex do sistema para garantir que mais de um não seja iniciado) para atuar como intermediário e hub de registro para todos os outros processos.

Mais uma coisa para analisar o modelo Publish-Subscribe para eventos (Pub/Sub).Essa técnica ajuda quando você tem um ouvinte iniciado antes que a origem do evento esteja disponível, mas você não deseja esperar para registrar-se no evento.O processo “servidor” cuidará do registro de eventos para vincular os editores e assinantes.

Outras dicas

Por que não hospedar o servidor e o cliente em ambos os lados, e quem aparecer primeiro será o servidor?E se o servidor cair, o cliente que ainda está ativo troca de função.

Há muitas maneiras de lidar com IPC (.net ou não) e através de um túnel TCP/HTTP é uma maneira... mas pode ser uma escolha muito ruim (dependendo das circunstâncias e do ambiente).

Memória compartilhada e pipes nomeados são duas maneiras (e sim, podem ser feitas em .Net) que podem ser soluções melhores para você.Há também a classe IPC no .Net Framework... mas eu pessoalmente não gosto deles devido a alguns problemas do AppDomain...

Concordo com o Garô.

Usar um serviço pub/sub seria uma ótima solução.Obviamente, isso significa que esse serviço precisaria estar instalado e funcionando antes de qualquer um dos outros dois.

Se você quiser pular o pub/sub, basta implementar o serviço em ambos os aplicativos com pontos finais diferentes.Quando qualquer um dos aplicativos é iniciado, ele tenta acessar o outro objeto conhecido através do proxy IPC.Se o proxy falhar, o outro objeto não estará ativo.

-Scott

Passei dois dias percorrendo todas as opções disponíveis para IPC enquanto procurava uma maneira confiável, simples e rápida de fazer IPC full-duplex. Biblioteca IPCL, que encontrei no Codeplex.com, até agora está funcionando perfeitamente com todas as opções que tentei.Tudo com apenas 7 linhas de código.:D Se alguém se deparar com isso tentando encontrar um IPC full-duplex, economize muito tempo e experimente esta biblioteca.Pegue o código fonte, compile o data.dll e siga os exemplos dados.

Hth, circ

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