La forma correcta de utilizar un mutex para este propósito:
private static Mutex mutex;
static void Main()
{
// STEP 1: Create and/or check mutex existence in a race-free way
bool created;
mutex = new Mutex(false, "YourAppName-{add-your-random-chars}", out created);
if (!created)
{
MessageBox.Show("Another instance of this application is already running");
return;
}
// STEP 2: Run whatever the app needs to do
Application.Run(new Form1());
// No need to release the mutex because it was never acquired
}
Lo anterior no va a funcionar para detectar si varios usuarios en la misma máquina se están ejecutando la aplicación en diferentes cuentas de usuario.Un caso similar es donde un proceso puede ejecutar ambos bajo el host de servicio y independiente. Para realizar estos trabajos, crear la exclusión mutua de la siguiente manera:
var sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
var mutexsecurity = new MutexSecurity();
mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.FullControl, AccessControlType.Allow));
mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.ChangePermissions, AccessControlType.Deny));
mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.Delete, AccessControlType.Deny));
_mutex = new Mutex(false, "Global\\YourAppName-{add-your-random-chars}", out created, mutexsecurity);
dos diferencias aquí - en primer lugar, la exclusión mutua tiene que ser creado con derechos de seguridad que permiten a otras cuentas de usuario para abrir/adquirirla. En segundo lugar, el nombre debe con el prefijo "Global" en el caso de los servicios que se ejecutan bajo el host de servicio (no estoy seguro de que otros usuarios se ejecuten localmente en la misma máquina).
Según tengo entendido, en los sistemas operativos basados en NT después de que un proceso termina por algún motivo, el SO libera todos los objetos kernal creados por ese proceso. ¿Es eso correcto? –
Probablemente puedas probarlo fácilmente ... Acabo de encontrar esto. http://stackoverflow.com/questions/646480/is-using-a-mutex-to-prevent-multipule-instances-of-the-same-program-from-running/646500 – Ian
-1: hay una carrera condición en la adquisición del mutex; ver mi respuesta alternativa. Además, mencionar que "SINGLEINSTANCE" debe ser exclusivo de la aplicación es obligatorio. –