Pregunta

Tengo una situación en la que puedo tener varias instancias de un programa ejecutándose a la vez y es importante que no se ejecute una sola función específica en más de una de estas instancias a la vez.

¿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");
}
¿Fue útil?

Solución

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

Aquí hay 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 createNew le permitirá saber si se creó o no la primera vez.Sin embargo, sólo te dice si ha sido creado.Si desea adquirir el bloqueo, debe llamar a WaitOne y luego a ReleaseMutex para liberarlo.Si solo desea ver si creó un Mutex, simplemente construirlo está bien.

Otros consejos

El Buscador tiene razón.

El consejo de Jeff Richter en Borrar a través de C# (p638-9) sobre el bloqueo es crear un objeto privado específicamente con el fin de bloquearlo.

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 subprocesos que se ejecutan dentro de un solo proceso.La respuesta de @David Mohundro es correcta para el bloqueo entre procesos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top