2008-09-05 14 views
9

Tengo una situación en la que podría tener varias instancias de un programa ejecutándose a la vez, y es importante que una sola función específica no se ejecute en más de una de estas instancias a la vez.¿Es este el uso correcto de un mutex?

¿Es esta la forma correcta de utilizar un mutex para evitar que esto suceda?

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

Respuesta

18

Dijiste varias instancias de una aplicación, por lo que estamos hablando en funcionamiento cerca de dos de program.exe, ¿verdad? La instrucción de bloqueo no se bloqueará en varios programas, solo dentro del programa. Si quieres un Mutex verdadero, mira el objeto System.Threading.Mutex.

Aquí está un ejemplo de uso:

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 variable createdNew le permitirá saber si es o no se crea la primera vez. Sin embargo, solo te dice si se ha creado. Si desea adquirir el bloqueo, debe llamar a WaitOne y luego llamar a ReleaseMutex para liberarlo. Si solo quieres ver si creaste un Mutex, simplemente construirlo está bien.

5

TheSeeker es correcto.

El consejo de Jeff Richter en Clr Via C# (p638-9) al bloquear es crear un objeto privado específicamente con el propósito de ser bloqueado.

private Object _lock = new Object(); 

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

Esto funciona porque _lock no puede ser bloqueado por nada fuera de la clase actual.

EDITAR: esto es aplicable a los hilos que se ejecutan en un solo proceso. La respuesta de @David Mohundro es correcta para el bloqueo entre procesos.