2009-09-30 7 views
6

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

5

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.

+0

Schönes Tutorial. Ich musste das lesen. Und Wartegriffe lösten mein Problem für mich. – feihtthief

4

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

3

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.

2

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.

Verwandte Themen