Ce qui est un bon modèle pour l'utilisation de Mutex Global en C#?
La classe Mutex est très mal compris, et Global mutex plus encore.
Ce qui est bon, coffre-fort modèle à utiliser lors de la création Mondiale de mutex?
Un qui fonctionne
- Indépendamment des paramètres régionaux ma machine est en
- Est garanti pour libérer le mutex correctement
- Éventuellement ne pas s'accrocher éternellement si le mutex n'est pas acquis
- Concerne les cas où d'autres processus abandonner le mutex
Vous devez vous connecter pour publier un commentaire.
Je veux m'assurer que c'est là-bas, parce que c'est tellement dur pour obtenir le droit:
using
pour vérifiercreatedNew
et ajoutermutex.Dispose()
à l'intérieur definally
. Je ne peux pas l'expliquer clairement (je ne sais pas la raison) pour l'instant, mais j'ai eu moi-même à une situation oùmutex.WaitOne
retournétrue
aprèscreatedNew
est devenufalse
(que j'ai acquis le mutex dans le courantAppDomain
puis a chargé un nouveauAppDomain
et exécuté le même code à partir de l'intérieur).exitContext = false
faire quoi que ce soit dansmutex.WaitOne(5000, false)
? on dirait qu'Il ne pouvait provoquer une assertion dans CoreCLR, 2. Si quelqu'un se demande, dansMutex
s'constructeur, la raison pour laquelleinitiallyOwned
estfalse
est partiellement expliqué par le cet article MSDN.À l'aide de la accepté de répondre, j'ai créer une classe d'assistance afin que vous pouvez utiliser, d'une manière similaire, vous utiliserez l'instruction Lock. Juste pensé que je vous ferais partager.
Utilisation:
Et la classe helper:
< 0
au lieu de<= 0
._mutex.Close()
au lieu de_mutex.Dispose()
dans la méthode dispose a fonctionné pour moi. L'erreur a été cause en essayant de disposer de la sous-jacentes WaitHandle.Mutex.Close()
dispose des ressources sous-jacentes.Cet exemple de sortie au bout de 5 secondes si une autre instance est déjà en cours d'exécution.
Il y a une condition de concurrence dans l'acceptation de réponse après 2 processus en cours d'exécution de moins de 2 différents utilisateurs de l'initialisation de l'mutex en même temps.
Après la première opération initialise le mutex, si le deuxième processus tente d'initialiser le mutex avant la première étape est la règle d'accès pour tout le monde, non autorisée exception sera levée par le second processus.
Voir ci-dessous pour la réponse corrigé:
Ni Mutex ni WinApi CreateMutex() fonctionne pour moi.
Une solution alternative:
Et la
SingleApplicationDetector
:Raison de l'utilisation d'un Sémaphore au lieu de Mutex:
Ref: Sémaphore.OpenExisting()
Semaphore.OpenExisting
etnew Semaphore
.Parfois, l'apprentissage par l'exemple le plus. Exécutez cette application console dans trois différentes fenêtres de console. Vous verrez que l'application vous a manqué première acquiert le mutex première, tandis que les deux autres attendent leur tour. Appuyez sur entrée dans la première application, vous verrez que l'application 2 continue maintenant en cours d'exécution par l'acquisition de la mutex, cependant l'application 3 est en attente de son tour. Lorsque vous appuyez sur entrée dans la demande 2 vous verrez que l'application 3 continue. Cela illustre bien le concept d'un mutex la protection d'une section de code destiné à être exécuté que par un seul thread (dans ce cas, un processus) comme en écriture à un fichier comme un exemple.