Synchronisation de 2 processus à l'aide d'objets de synchronisation interprocess - Mutex ou AutoResetEvent
Envisagez le scénario suivant: je suis en cours d'exécution de mon application qui, au cours de son exécution, doit exécuter un autre processus, et seulement après que la 2e fin du processus interne d'initialisation spécifique, peut-être mon premier processus se poursuivre. E. g:
...
//Process1 code does various initializations here
Process.Start("Process2.exe");
//Wait until Process2 finishes its initialization and only then continue (Process2 doesn't exit)
...
Je vois plusieurs options:
- Mutex - Mutex vient à l'esprit automatiquement lorsque l'on considère la communication interprocessus, cependant, je ne peux pas voir un moyen de provoquer de Fabrication1 attendre un mutex qu'il a généré lui-même. Je peut causer Process2 pour créer un mutex et d'attendre sur Process1 jusqu'le Mutex est créé (à l'aide de vote et Mutex.OpenExisting fonction)
- AutoResetEvent - Ceux qui seraient parfaites pour la tâche, cependant, il semble qu'en vertu de l' .NET de ces ne peut pas être utilisé pour interprocessus communcation.
- CreateEvent - je peux l'utiliser P/Invoke et l'utilisation Win32 CreateEvent fonction. En théorie, il pourrait me fournir ce dont j'ai besoin. Je préfère ne pas utiliser les fonctions natives, cependant, si cela est possible.
- Utiliser un fichier externe - Le plus simple serait d'utiliser certains OS externe de l'objet (fichier, base de registre, etc). Toutefois, cela semble plutôt hacky, cependant.
Je serais heureux d'entendre votre avis, pour ce cas.
Merci!
source d'informationauteur VitalyB
Vous devez vous connecter pour publier un commentaire.
J'allais éditer cette réponsemais il ne me semble pas correct. Donc, je vais poster mon propre...
Selon la Les Threads en C# page, qui a beaucoup de synchronisation des tutoriels,
AutoResetEvent
ne peut pas être utilisé pour la synchronisation interprocessus.Cependant, un nom de
EventWaitHandle
peut être utilisé pour la synchronisation interprocessus.Dans la page mentionnée ci-dessus, visitez le La création d'un inter-Processus EventWaitHandle section.
La façon dont vous définissez cette place est très simple:
EventWaitHandle
dans le processus de 1, avant de commencer le processus 2.EventWaitHandle.WaitOne
pour bloquer le thread courant.EventWaitHandle
dans le processus 2 et invoquerEventWaitHandle.Set
pour libérer le thread en attente.Processus 1
Processus 2
Maintenant, concernant le
EventResetMode
.Si vous choisissez
EventResetMode.AutoReset
ouEventResetMode.ManualReset
dépend de votre application.Dans mon cas, j'avais besoin d'un réarmement manuel parce que j'ai ont beaucoup de procédés de se connecter au même processus. Ainsi, une fois cette même processus est fait en cours d'initialisation, tous les autres processus doivent être en mesure de faire le travail. Ainsi, la poignée doit être laissé dans un état signalé (pas de reset).
Pour vous, un réarmement automatique peut être utile si vous devez procéder à l'initialisation de tous les temps processus 1 commence processus 2.
Note de côté: La
InterprocessProtocol.EventHandleName
est juste une constante enveloppé à l'intérieur d'une DLL que les deux processus 1 et processus 2 de référence. Vous n'avez pas besoin de faire cela, mais il vous protège du mal à taper le nom et provoquant un blocage.je voudrais prendre en considération **AutoResetEvent **. ils peuvent être utilisés pour interprocessus communcation et ils sont relativley rapide.
voir le lien suivant: Les Threads en c#
lire la Création d'un inter-Processus EventWaitHandle section...