Domanda

Ho una situazione in cui potrei avere più istanze di un programma in esecuzione contemporaneamente ed è importante che solo una funzione specifica non venga eseguita in più di una di queste istanze contemporaneamente.

È questo il modo corretto di utilizzare un mutex per evitare che ciò accada?

lock (this.GetType()) {
    _log.Info("Doing Sync");
    DoSync();
    _log.Info("Sync Completed");
}
È stato utile?

Soluzione

Hai detto più istanze di un'applicazione, quindi stiamo parlando di due programmi.exe in esecuzione, giusto?L'istruzione lock non si bloccherà su più programmi, ma solo all'interno del programma.Se vuoi un vero Mutex, guarda il System.Threading.Mutex oggetto.

Ecco un esempio di utilizzo:

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();
    }
}

La variabile CreateNew ti farà sapere se è stata creata o meno la prima volta.Tuttavia, ti dice solo se è stato creato.Se vuoi acquisire il blocco, devi chiamare WaitOne e poi chiamare ReleaseMutex per rilasciarlo.Se vuoi solo vedere se hai creato un Mutex, anche solo costruirlo va bene.

Altri suggerimenti

TheSeeker ha ragione.

Il consiglio di Jeff Richter in Cancella tramite C# (p638-9) sul blocco consiste nel creare un oggetto privato appositamente allo scopo di essere bloccato.

private Object _lock = new Object();

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

Funziona perché _lock non può essere bloccato da nulla al di fuori della classe corrente.

MODIFICARE:questo è applicabile ai thread in esecuzione all'interno di un singolo processo.La risposta di @ David Mohundro è corretta per il blocco tra processi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top