Ich hatte gehofft, dass es eine einfache Möglichkeit gibt, ein Ereignis an mehrere Prozesse zu signalisieren, bei denen ich keinen benutzerdefinierten Socket-Listener schreiben musste. Ich versuche, mehrere Anwendungen zu informieren, die ihre zwischengespeicherten Konfigurationseinstellungen aktualisieren müssen, dass eine Konfigurationsänderung stattgefunden hat. Ich wollte einen "Host Wide" Singleton implementieren, konnte aber keine Beispiele finden. Ist so etwas überhaupt möglich?Einfachste Möglichkeit, ein Ereignis an mehrere Prozesse in .NET zu signalisieren.
Antwort
Sie prozessübergreifende Griffe warten können. Schauen Sie sich dieses ausgezeichnete threading tutorial für weitere Informationen.
Sie können die Warte-Handles in einer Singleton-Klasse verwenden, um eine Art Host-Wide-Singleton zu erstellen. Hier finden Sie alles, was Sie über die singleton pattern in C# wissen müssen.
Eine mögliche Implementierung: Das Singleton könnte die Konfigurationseinstellungen darstellen. Vor dem Abrufen einer Einstellung können Sie den Zeitstempel für eine Datei überprüfen, in der die zwischengespeicherten Konfigurationseinstellungen gespeichert sind. Lese-/Schreibzugriff auf die Datei könnte durch Warte-Handles geschützt werden.
Wenn Sie Wartezeichen verwenden möchten, können Sie einen Zeitstempel in der Registrierung festlegen. Das Abrufen und Festlegen von Registrierungswerten sind atomare Vorgänge, sodass sie automatisch Thread-sicher sind. Beachten Sie jedoch, dass hierfür Registrierungsberechtigungen erforderlich sind. Dies kann daher unerwünscht sein, es sei denn, Sie können sicher sein, dass Ihre Benutzer über die erforderlichen Berechtigungen verfügen.
Benannte Semaphore und Benannte Mutex werden für die Interprozesssynchronisation verwendet.
Msdn sagt:
Semaphore sind von zweierlei Art: lokale Semaphore und benannte System Semaphore. Wenn Sie ein Semaphore-Objekt mit einem Konstruktor erstellen, der einen Namen akzeptiert, wird es einem Betriebssystem-Semaphor dieses Namens zugeordnet. Benannte System-Semaphore sind im gesamten Betriebssystem sichtbar und können verwendet werden, um die Aktivitäten von Prozessen zu synchronisieren.
Msdn sagt:
Named System mutexes im gesamten Betriebssystem sichtbar ist und verwendet werden kann, die Aktivitäten der Prozesse zu synchronisieren. Sie können ein Mutex-Objekt erstellen, das einen benannten Systemmutex darstellt, indem Sie einen Konstruktor verwenden, der einen Namen akzeptiert. Das Betriebssystemobjekt kann zur selben Zeit erstellt werden oder es kann vor der Erstellung des Mutex-Objekts existieren.
this helps
Sie können ein benanntes EventWaitHandle verwenden. Sie benötigen jedoch auch eine Möglichkeit, das Ereignis zurückzusetzen, nachdem alle überwachten Prozesse benachrichtigt wurden. Sie können wahrscheinlich etwas wie das Ereignis einstellen und dann nach einer kurzen Zeit zurücksetzen: eine Sekunde oder fünf Sekunden. Kunden könnten wissen, dass das Ereignis nicht schnell hintereinander ausgelöst wird.
Eine andere Möglichkeit ist, einen benannten Semaphore zu verwenden. Aber dann müssen Sie wissen, wie viele Listener vorhanden sind, damit Sie die Anfangs- und Maximalwerte des Semaphors festlegen können.
Es gibt Möglichkeiten zu tun, was Sie fragen, ohne etwas Phantasie zu bauen.
Für eng gekoppelt Publisher/Subscriber-Modell (wo der Verlag ausdrücklich von allen Teilnehmern bewusst ist):
können Sie einen Semaphore vom Verlag festgelegt verwenden und haben alle Teilnehmer auf sie warten. Wenn jedoch einer der Abonnenten stirbt, wird Ihre Zählung abgewiesen. Sie müssen eine Form einer Zombie-Erkennung implementieren
Sie könnten COM-Anschlüsse verwenden. Dies erfordert Administratorregistrierung der COM-Klassen und Typbibliotheken.
Für lose gekoppelten Publisher/Subscriber-Modell (wo der Verlag nicht anythig über die Teilnehmer nicht wissen):
Wenn Sie die Konfiguration settigns werden in einer Datei oder in der Registrierung gespeichert, die Abonnenten können eine Datei oder eine Registrierung ändern Listener implementieren. Leider ist diese Lösung auf Datei-/Registrierungsänderungen beschränkt, wird nicht skaliert und kann aufgrund der Dateisystem-/Registrierungslast Verzögerungen unterliegen.
Sie können das COM + lose gekoppelte Ereignisse (durch System.EnterpriseServices). Dies könnte jedoch aufgrund der Komplexität von LCE ein Overkill für Sie sein.
Sie können eine Fenstermeldung senden, die der Publisher über
RegisterWindowMessage
an alle versteckten Top-Level-Fenster einer bestimmten Klasse gesendet hat. Alle Abonnenten müssen ein solches Fenster erstellen. Dies würde einige Win32-Interop erfordern, ist aber wahrscheinlich die einfachste Möglichkeit, lose gekoppelte Publisher/Subscriber zu implementieren.
- 1. Einfachste Möglichkeit, mehrere PNG8-Bilder in .NET zu kombinieren
- 2. Mehrere .NET-Prozesse Speicherbedarf
- 3. Einfachste Möglichkeit, ein Rechteck zu drehen
- 4. Einfachste Möglichkeit, grundlegende Autorisierung in .NET zu decodieren
- 5. Einfachste Möglichkeit, ein zweidimensionales Array zu implodieren()?
- 6. Einfachste Möglichkeit, mehrere Zweige in einer einzigen Zeile zu reverbieren
- 7. Einfachste Möglichkeit, Lokalisierungsdateien zu generieren
- 8. einfachste Möglichkeit, ein Bild in Silverlight zu zentrieren?
- 9. Einfachste Möglichkeit, einen anderen Server zu hören?
- 10. Einfachste Möglichkeit, Grafiken zu erstellen
- 11. Einfachste Möglichkeit, ein Bild in Javafx hinzuzufügen?
- 12. Einfachste Möglichkeit, ein Datum in PHP zu erhöhen?
- 13. Einfachste Möglichkeit, Route in PHP zu mappen
- 14. Mehrere wiederkehrende Prozesse
- 15. Erlang-Stil leichte Prozesse in .NET
- 16. einfachste Möglichkeit, Svg in Android zu verwenden?
- 17. Einfachste Möglichkeit, ein Array von C++ nach C# zu verschieben, zu modifizieren und an C++ zurückzugeben
- 18. Mehrere Prozesse schreiben in dieselbe Datei (.net/C#)
- 19. So senden Sie ein Ereignis an mehrere Formulare in Delphi
- 20. Einfachste Möglichkeit, ein Programm zu minimieren, um die Taskleiste mit .NET 4
- 21. Angular2 einfachste Möglichkeit, HTTP-Antworten zu cachen
- 22. Einfachste Möglichkeit, ein Datenmodell nach Rails-Migration zu portieren
- 23. Einfachste Möglichkeit, die gesamte Dateistruktur zu speichern?
- 24. Beste Möglichkeit, ein XmlDocument (.NET) zu verschönern?
- 25. Loopback - Einfachste Möglichkeit, ein eingebautes Modell zu erweitern
- 26. Einfachste Möglichkeit, ein Bild auf JFrame zu zeichnen?
- 27. Einfachste Möglichkeit, ein Google Map-Mashup zu erstellen?
- 28. Einfachste Möglichkeit, ein int aus einem Mongo-Ergebnis zu erhalten?
- 29. Python - einfachste Möglichkeit, Funktionen parallel zu betreiben
- 30. Einfachste Möglichkeit ODBC auf Windows zu testen
Schönes Tutorial. Ich musste das lesen. Und Wartegriffe lösten mein Problem für mich. – feihtthief