Frage

Ich befinde mich in einer Situation, in der möglicherweise mehrere Instanzen eines Programms gleichzeitig ausgeführt werden, und es ist wichtig, dass nur eine bestimmte Funktion nicht in mehr als einer dieser Instanzen gleichzeitig ausgeführt wird.

Ist dies der richtige Weg, einen Mutex zu verwenden, um dies zu verhindern?

lock (this.GetType()) {
    _log.Info("Doing Sync");
    DoSync();
    _log.Info("Sync Completed");
}
War es hilfreich?

Lösung

Sie sagten mehrere Instanzen einer Anwendung, wir reden also über die Ausführung von zwei program.exe, oder?Die Sperranweisung sperrt nicht über mehrere Programme hinweg, sondern nur innerhalb des Programms.Wenn Sie einen echten Mutex wollen, schauen Sie sich das an System.Threading.Mutex Objekt.

Hier ist ein Anwendungsbeispiel:

bool createdNew;
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew))
{
    try
    {
        mtx.WaitOne();

        MessageBox.Show("Click OK to release the mutex.");
    }
    finally
    {
        mtx.ReleaseMutex();
    }
}

Die Variable „createdNew“ teilt Ihnen mit, ob sie beim ersten Mal erstellt wurde oder nicht.Allerdings erfahren Sie hier nur, ob es erstellt wurde.Wenn Sie die Sperre erwerben möchten, müssen Sie WaitOne und dann ReleaseMutex aufrufen, um sie freizugeben.Wenn Sie nur sehen möchten, ob Sie einen Mutex erstellt haben, ist es in Ordnung, ihn einfach zu erstellen.

Andere Tipps

TheSeeker hat recht.

Jeff Richters Rat in Clr über C# (p638-9) beim Sperren besteht darin, ein privates Objekt speziell für den Zweck der Sperrung zu erstellen.

private Object _lock = new Object();

// usage
lock( _lock )
{
    // thread-safe code here..
}

Dies funktioniert, weil _lock nicht von irgendetwas außerhalb der aktuellen Klasse gesperrt werden kann.

BEARBEITEN:Dies gilt für Threads, die innerhalb eines einzelnen Prozesses ausgeführt werden.Die Antwort von @David Mohundro ist für das Sperren zwischen Prozessen richtig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top