Was ist ein gutes Muster für die Verwendung ist eine Globale Mutex in C#?
Die Mutex-Klasse ist sehr missverstanden und Globale Mutexe sogar noch mehr.
Was ist gute, sichere Muster zu verwenden, wenn Sie Globale Mutexe?
Ein, die Arbeit
- Unabhängig von der Ländereinstellung, meine Maschine ist in
- Ist garantiert das mutex freizugeben, richtig
- Optional nicht immer hängen, wenn der mutex ist nicht erworben
- Befasst sich mit Fällen, in denen andere Prozesse verlassen die mutex
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich möchte sicherstellen, dass dieser draussen ist, weil er so schwer zu bekommen Recht:
using
zu überprüfencreatedNew
und fügen Siemutex.Dispose()
innenfinally
. Ich kann nicht erklären, klar (ich weiß nicht den Grund), jetzt aber hab ich mich an eine situation, alsmutex.WaitOne
zurückgegebentrue
nachcreatedNew
wurdefalse
(ich erwarb den mutex in der aktuellenAppDomain
geladen und dann eine neueAppDomain
und ausgeführt den gleichen code in es).exitContext = false
alles inmutex.WaitOne(5000, false)
? wie Es aussieht, könnte es nur dazu führen, dass ein assert in CoreCLR, 2. Wenn jemand fragt sich, inMutex
's Konstruktor, der Grund, waruminitiallyOwned
istfalse
ist teilweise erklärt durch in diesem MSDN-Artikel.Über die akzeptierte Antwort, die ich erstellen Sie eine helper-Klasse, so dass Sie es verwenden können in einer ähnlichen Weise wie der Lock-Anweisung. Ich dachte würde ich teilen.
Verwenden:
Und die helper-Klasse:
< 0
statt<= 0
._mutex.Close()
statt_mutex.Dispose()
in die Dispose-Methode für mich gearbeitet. Der Fehler wurde verursacht durch den Versuch, Sie zu entsorgen die zugrunde liegenden WaitHandle.Mutex.Close()
verfügt über die zugrunde liegenden Ressourcen.Diesem Beispiel wird der Ausgang nach 5 Sekunden, wenn eine andere Instanz wird bereits ausgeführt.
Gibt es eine race-condition in der akzeptierten Antwort, wenn 2 Prozesse laufen unter 2 verschiedenen Benutzer, die versuchen, initialisiert den mutex zur gleichen Zeit.
Nach dem ersten Prozess initialisiert den mutex, wenn der zweite Prozess versucht initialisiert den mutex bevor der erste Prozess legt die Zugriffsregeln für alle, die eine unberechtigte Ausnahme ausgeworfen wird, durch den zweiten Prozess.
Siehe unten korrigierte Antwort:
Weder Mutex noch WinApi CreateMutex() funktioniert bei mir.
Einer alternativen Lösung:
Und die
SingleApplicationDetector
:Grund für die Verwendung von Semaphore statt Mutex:
Ref: Semaphore.OpenExisting()
Semaphore.OpenExisting
undnew Semaphore
.Manchmal lernen durch Beispiel hilft den. Diese Konsolenanwendung ausführen in drei verschiedenen Konsolen-Fenster. Sie werden sehen, dass die Anwendung, die Sie lief zuerst erwirbt der mutex ersten, während die anderen beiden warten. Drücken Sie dann die EINGABETASTE in der ersten Anwendung werden Sie sehen, dass Anwendung 2 nun weiter ausgeführt wird, durch den Erwerb des mutex, jedoch Anwendung 3 wartet seinerseits. Nachdem Sie die EINGABETASTE in der Anwendung 2 sehen Sie, dass die Anwendung 3 weiter. Dies illustriert das Konzept von mutex-Schutz einen Abschnitt des Codes ausgeführt werden nur von einem thread (in diesem Fall ein Prozess) wie schreiben in eine Datei als Beispiel.