Domanda

Ho due processi non correlati che utilizzano gli assembly .NET come plug-in.Tuttavia, entrambi i processi possono essere avviati/interrotti in qualsiasi momento.Non posso fare affidamento sul fatto che un particolare processo sia il server.In effetti, potrebbero essere in esecuzione più copie di uno dei processi, ma solo una dell'altro.

Inizialmente ho implementato una soluzione basata su Questo articolo.Tuttavia, ciò richiede che chi implementa il server sia in esecuzione prima del client.

Qual è il modo migliore per implementare un qualche tipo di notifica al server quando i client erano in esecuzione per primi?

È stato utile?

Soluzione

Usare la memoria condivisa è più difficile perché dovrai gestire la dimensione del buffer di memoria condivisa (o semplicemente pre-allocarne abbastanza).Dovrai anche gestire manualmente le strutture dati che inserisci lì.Una volta testato e funzionante, sarà più facile da usare e testare grazie alla sua semplicità.

Se si utilizza il percorso remoto, è possibile utilizzare IpcChannel invece dei canali TCP o HTTP per una comunicazione di sistema singolo utilizzando Named Pipes. http://msdn.microsoft.com/en-us/library/4b3scst2.aspx.Il problema con questa soluzione è che dovrai trovare una soluzione di tipo registro (nella memoria condivisa o in qualche altro archivio persistente) con cui i processi possano registrare i propri endpoint.In questo modo, quando li cerchi, puoi trovare un modo per eseguire query su tutti gli endpoint in esecuzione sul sistema e trovare ciò che stai cercando.I vantaggi di utilizzare Remoting sono che la serializzazione e la chiamata al metodo sono tutte piuttosto semplici.Inoltre, se decidi di spostarti su più macchine su una rete, puoi semplicemente premere l'interruttore per utilizzare invece i canali di rete.Gli svantaggi sono che la comunicazione remota può diventare frustrante a meno che non si separino chiaramente le chiamate "remote" da quelle "locali".

Non so molto di WCF, ma potrebbe valere la pena esaminarlo.Il senso del ragno dice che probabilmente ha una soluzione più elegante a questo problema...Forse.

In alternativa, è possibile creare un processo "server" che sia separato da tutti gli altri processi e che venga avviato (utilizzare un sistema Mutex per assicurarsi che non venga avviato più di uno) per fungere da intermediario e hub di registrazione per tutti gli altri processi.

Un'altra cosa da esaminare è il modello Pubblica-Sottoscrivi per gli eventi (Pub/Sub).Questa tecnica è utile quando hai un ascoltatore che viene avviato prima che l'origine dell'evento sia disponibile, ma non vuoi aspettare per registrarti all'evento.Il processo "server" gestirà il registro degli eventi per collegare gli editori e gli abbonati.

Altri suggerimenti

Perché non ospitare il server e il client su entrambi i lati e chi arriva per primo diventa il server?E se il server si interrompe, il client ancora attivo cambia ruolo.

Esistono molti modi per gestire IPC (.net o meno) e tramite un tunnel TCP/HTTP è un modo... ma può essere una pessima scelta (a seconda delle circostanze e dell'ambiente).

La memoria condivisa e le pipe denominate sono due modi (e sì, possono essere eseguiti in .Net) che potrebbero essere soluzioni migliori per te.Esiste anche la classe IPC nel .Net Framework...ma personalmente non mi piacciono a causa di alcuni problemi di AppDomain...

Sono d'accordo con Garo.

Usare un servizio pub/sub sarebbe un'ottima soluzione.Ciò ovviamente significa che questo servizio dovrebbe essere attivo e funzionante prima degli altri due.

Se vuoi saltare il pub/sub puoi semplicemente implementare il servizio in entrambe le applicazioni con endpoint diversi.Quando viene avviata una delle applicazioni, tenta di accedere all'altro oggetto noto tramite il proxy IPC.Se il proxy fallisce, l'altro oggetto non è attivo.

-Scott

Ho trascorso 2 giorni esplorando tutte le opzioni disponibili per IPC mentre cercavo un modo affidabile, semplice e veloce per eseguire IPC full-duplex. IPCLibrary, che ho trovato su Codeplex.com, finora funziona perfettamente con tutte le opzioni che ho provato.Il tutto con solo 7 righe di codice.:D Se qualcuno si imbatte in questo cercando di trovare un IPC full-duplex, risparmia un sacco di tempo e prova questa libreria.Prendi il codice sorgente, compila data.dll e segui gli esempi forniti.

Hth, circ

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top