2009-09-30 5 views
6

J'espérais qu'il y avait un moyen facile de signaler un événement à plusieurs processus qui n'impliquaient pas l'écriture d'un écouteur de socket personnalisé. J'essaie d'informer plusieurs applications qui auront besoin de mettre à jour leurs paramètres de configuration en cache qu'une modification de configuration s'est produite. Je voulais implémenter un singleton "host large", mais je n'ai trouvé aucun exemple. Est-ce qu'une telle chose est même possible?Manière la plus facile de signaler un événement à plusieurs processus dans .NET

Répondre

5

Vous pouvez utiliser les poignées d'attente inter-processus. Découvrez cet excellent threading tutorial pour plus d'informations.

Vous pouvez utiliser les poignées d'attente dans une classe singleton pour créer une sorte de singleton large hôte. Voici tout ce que vous devez savoir sur le singleton pattern in C#.

Une implémentation possible: le singleton pourrait représenter les paramètres de configuration. Avant de récupérer un paramètre, vous pouvez vérifier l'horodatage sur un fichier qui stocke les paramètres de configuration mis en cache. L'accès en lecture/écriture au fichier pourrait être protégé par des poignées d'attente.

Si vous ne souhaitez pas utiliser les poignées d'attente, vous pouvez définir un horodatage dans le registre. L'obtention et la définition des valeurs de registre sont des opérations atomiques, elles sont donc automatiquement sécurisées pour les threads. Sachez cependant que cela nécessite des autorisations de registre, ce qui peut être indésirable, sauf si vous êtes sûr que vos utilisateurs disposent des privilèges requis.

+0

Beau tutoriel. J'avais besoin de lire ça. Et les poignées d'attente ont résolu mon problème pour moi. – feihtthief

4

Nommé sémaphore et nommé mutex sont utilisés pour la synchronisation interprocessus.

Msdn dit:

sémaphores sont de deux types: sémaphores locaux et sémaphores du système nommé. Si vous créez un objet Semaphore à l'aide d'un constructeur qui accepte un nom, il est associé à un sémaphore de système d'exploitation portant ce nom. Les sémaphores de système nommés sont visibles dans tout le système d'exploitation et peuvent être utilisés pour synchroniser les activités des processus.

Msdn dit:

mutex système nommés sont visibles à travers le système d'exploitation, et peuvent être utilisés pour synchroniser les activités des processus. Vous pouvez créer un objet Mutex qui représente un mutex système nommé en utilisant un constructeur qui accepte un nom. L'objet du système d'exploitation peut être créé en même temps, ou il peut exister avant la création de l'objet Mutex.

Hope this helps

3

Vous pouvez utiliser un objet EventWaitHandle nommé. Cependant, vous aurez également besoin d'un moyen de réinitialiser l'événement après que tous les processus d'écoute ont été notifiés. Vous pouvez probablement faire quelque chose comme définir l'événement et le réinitialiser après une courte période de temps: une seconde ou cinq secondes. Les clients peuvent savoir que l'événement ne se déclenchera pas rapidement de suite.

Une autre possibilité consiste à utiliser un sémaphore nommé. Mais alors vous devez savoir combien il y a d'auditeurs pour pouvoir définir les valeurs initiales et maximales du sémaphore.

Il existe des moyens de faire ce que vous demandez sans avoir à construire quelque chose de fantaisie.

2

Pour le modèle éditeur/abonné étroitement couplé (où l'éditeur est explicitement au courant de tous les abonnés):

  • Vous pouvez utiliser un sémaphores fixé par l'éditeur et ont tous les abonnés attendent sur elle. Cependant, si l'un des abonnés meurt, votre compte sera rejeté. Vous devrez implémenter une forme de détection de zombie

  • Vous pouvez utiliser points de connexion COM. Cela nécessite l'enregistrement de l'administrateur des classes COM et des bibliothèques de types.

Pour le modèle éditeur/abonné à couplage lâche (où l'éditeur ne sait pas anythig sur les abonnés):

  • Si vous Configuration settigns sont conservés dans un fichier ou dans le registre, le les abonnés peuvent implémenter un fichier ou un écouteur de modification de registre. Malheureusement, cette solution est limitée aux modifications apportées aux fichiers/registres, n'est pas évolutive et peut être soumise à des retards en fonction de la charge du système de fichiers/du registre.

  • Vous pouvez utiliser le COM + Events Librement Coupled (par System.EnterpriseServices). Cependant, cela pourrait être une exagération pour vous en raison de la complexité de LCE.

  • Vous pouvez diffuser un message de fenêtre que l'éditeur a enregistré via RegisterWindowMessage à toutes les fenêtres de niveau supérieur masquées d'une classe particulière. Tous les abonnés devront créer une telle fenêtre. Cela nécessiterait un peu d'interopérabilité Win32, mais c'est probablement le moyen le plus léger de mettre en œuvre un éditeur/abonné faiblement couplé.

Questions connexes