Frage

Ich habe zwei unabhängige Prozesse, die .NET-Assemblys als Plugins verwenden.Beide Prozesse können jedoch jederzeit gestartet/gestoppt werden.Ich kann mich nicht darauf verlassen, dass ein bestimmter Prozess der Server ist.Tatsächlich kann es sein, dass von einem der Prozesse mehrere Kopien ausgeführt werden, von den anderen jedoch nur eine.

Ich habe zunächst eine Lösung basierend auf implementiert Dieser Artikel.Dies erfordert jedoch, dass derjenige, der den Server implementiert, vor dem Client ausgeführt wird.

Was ist der beste Weg, um eine Benachrichtigung an den Server zu implementieren, wenn die Clients zuerst ausgeführt wurden?

War es hilfreich?

Lösung

Die Verwendung von Shared Memory ist schwieriger, da Sie die Größe des Shared Memory-Puffers verwalten (oder einfach genug vorab zuweisen müssen).Außerdem müssen Sie die dort eingegebenen Datenstrukturen manuell verwalten.Sobald Sie es jedoch getestet haben und funktionieren, wird es aufgrund seiner Einfachheit einfacher zu verwenden und zu testen sein.

Wenn Sie die Remoting-Route wählen, können Sie den IpcChannel anstelle der TCP- oder HTTP-Kanäle für eine einzelne Systemkommunikation mithilfe von Named Pipes verwenden. http://msdn.microsoft.com/en-us/library/4b3scst2.aspx.Das Problem bei dieser Lösung besteht darin, dass Sie eine Registrierungslösung (entweder im gemeinsam genutzten Speicher oder in einem anderen dauerhaften Speicher) finden müssen, bei der Prozesse ihre Endpunkte registrieren können.Auf diese Weise können Sie bei der Suche eine Möglichkeit finden, alle Endpunkte abzufragen, die auf dem System ausgeführt werden, und finden, wonach Sie suchen.Die Vorteile von Remoting bestehen darin, dass die Serialisierung und der Methodenaufruf ziemlich einfach sind.Wenn Sie sich dazu entschließen, auf mehrere Computer in einem Netzwerk umzusteigen, können Sie einfach den Schalter umlegen und stattdessen die Netzwerkkanäle verwenden.Die Nachteile bestehen darin, dass Remoting frustrierend sein kann, wenn Sie nicht klar unterscheiden, was „Remote“-Anrufe von „lokalen“ Anrufen sind.

Ich weiß nicht viel über WCF, aber es könnte sich auch lohnen, einen Blick darauf zu werfen.Spider Sense sagt, dass es wahrscheinlich eine elegantere Lösung für dieses Problem gibt ...Vielleicht.

Alternativ können Sie einen „Server“-Prozess erstellen, der von allen anderen Prozessen getrennt ist und gestartet wird (verwenden Sie einen System-Mutex, um sicherzustellen, dass nicht mehr als einer gestartet wird), um als Vermittler und Registrierungszentrale für alle zu fungieren die anderen Prozesse.

Noch ein Blick auf das Publish-Subscribe-Modell für Veranstaltungen (Pub/Sub).Diese Technik ist hilfreich, wenn Sie einen Listener haben, der gestartet wird, bevor die Ereignisquelle verfügbar ist, Sie aber nicht mit der Registrierung für das Ereignis warten möchten.Der „Server“-Prozess verwaltet die Ereignisregistrierung, um die Herausgeber und Abonnenten zu verbinden.

Andere Tipps

Warum nicht den Server und den Client auf beiden Seiten hosten und wer zuerst auftaucht, wird zum Server?Und wenn der Server ausfällt, wechselt der noch aktive Client die Rollen.

Es gibt viele Möglichkeiten, mit IPC umzugehen (.net oder nicht), und über einen TCP/HTTP-Tunnel ist eine Möglichkeit ... kann aber eine sehr schlechte Wahl sein (abhängig von den Umständen und der Umgebung).

Shared Memory und Named Pipes sind zwei Möglichkeiten (und ja, sie können in .Net durchgeführt werden), die für Sie möglicherweise die bessere Lösung sind.Es gibt auch die IPC-Klasse im .Net Framework ... aber ich persönlich mag sie aufgrund einiger AppDomain-Probleme nicht ...

Ich stimme Garo zu.

Die Verwendung eines Pub/Sub-Dienstes wäre eine großartige Lösung.Das bedeutet natürlich, dass dieser Dienst vor den beiden anderen betriebsbereit sein müsste.

Wenn Sie Pub/Sub überspringen möchten, können Sie den Dienst einfach in beiden Anwendungen mit unterschiedlichen Endpunkten implementieren.Wenn eine der Anwendungen gestartet wird, versucht sie, über den IPC-Proxy auf das andere bekannte Objekt zuzugreifen.Wenn der Proxy ausfällt, ist das andere Objekt nicht aktiv.

-Scott

Ich habe zwei Tage damit verbracht, alle verfügbaren IPC-Optionen durchzugehen und nach einer zuverlässigen, einfachen und schnellen Möglichkeit für Vollduplex-IPC zu suchen. IPCLibrary, das ich auf Codeplex.com gefunden habe, funktioniert bisher mit allen Optionen, die ich ausprobiert habe, einwandfrei.Alles mit nur 7 Zeilen Code.:D Wenn jemand auf der Suche nach einem Vollduplex-IPC darüber stolpert, sparen Sie sich eine Menge Zeit und probieren Sie diese Bibliothek aus.Besorgen Sie sich den Quellcode, kompilieren Sie die data.dll und befolgen Sie die angegebenen Beispiele.

HTH, Circ

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top