c# - sistemas - ¿Es este el uso apropiado de un mutex?
propiedad tag c# (2)
Dijiste varias instancias de una aplicación, así que estamos hablando de que se están ejecutando dos programas.exe, ¿verdad? La instrucción de bloqueo no se bloqueará en varios programas, solo dentro del programa. Si desea un Mutex verdadero, mire el objeto System.Threading.Mutex .
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 createdNew te permitirá saber si se creó o no 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.
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 esta la forma correcta de usar un mutex para evitar que esto suceda?
lock (this.GetType()) {
_log.Info("Doing Sync");
DoSync();
_log.Info("Sync Completed");
}
TheSeeker es correcto.
El consejo de Jeff Richter en Clr Via C # (p638-9) sobre el bloqueo 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 dentro de un proceso único. La respuesta de @David Mohundro es correcta para el bloqueo entre procesos.