Wenn Sie zwei Threads in einer Anwendung haben, und Sie wollen, dass sie nicht gleichzeitig ein bestimmtes Stück Code ausführen können, können Sie nur eine Sperre setzen um das Stück Code, wie folgt aus:C#: Wie kann verhindert werden, dass zwei Instanzen einer Anwendung gleichzeitig dasselbe tun?
lock (someObject) {
// ... some code
}
Aber Wie macht man dasselbe in verschiedenen Prozessen? Ich dachte, das ist das, was man einen „globalen Mutex“ verwenden für, so dass ich versuchte, die Mutex
Klasse auf verschiedene Weise, aber es scheint nicht meine Anforderungen zu erfüllen, die da sind:
- Wenn Sie der einzige sind Beispiel, gehen Sie voran und führen Sie den Code aus.
- Wenn Sie die zweite Instanz sind, warten Sie, bis die erste abgeschlossen ist, und führen Sie den Code aus.
- Keine Ausnahmen auslösen. Ich
Probleme lief in:
- einfach ein
Mutex
Objekt in einerusing(){...}
Klausel Instanziieren scheint nichts zu tun; die beiden Instanzen immer noch glücklich gleichzeitig - Aufruf von
.WaitOne()
auf dem Mutex bewirkt, dass die erste Instanz ausgeführt wird und die Sekunde zu warten, aber die zweite wartet unendlich, auch nach den ersten Aufrufen.ReleaseMutex()
und verlässt den Bereichusing(){}
. .WaitOne()
löst eine Ausnahme aus, wenn der erste Prozess beendet wird (System.Threading.AbandonedMutexException
).
Wie löse ich das? Lösungen, die Mutex
nicht betreffen, sind sehr willkommen, zumal Mutex
scheint Windows-spezifisch zu sein.
Sie verwenden .NET und beschweren sich darüber, dass 'Mutex' windowsspezifisch ist? –
@Anon .: http://www.mono-project.com/Main_Page – Randolpho
@Randolpho: Wer ist Ziel, die gesamte .NET-Bibliothek zu implementieren. Einschließlich 'System.Threading.Mutex'. Wenn es Teil der .NET-Bibliothek ist, können Sie erwarten, dass es auf jeder .NET-Plattform ausgeführt wird (einschließlich mono, sobald es diesen Teil implementiert hat). –