2010-05-13 21 views
19

Mi aplicación está obligada a utilizar un módulo de terceros que proyectará en pantalla azul Windows si se inician dos instancias al mismo tiempo en la misma máquina. Para evitar el problema, mi aplicación de C# tiene un mutex:cross-user C# mutex

static Mutex mutex = new Mutex(true, "{MyApp_b9d19f99-b83e-4755-9b11-d204dbd6d096}"); 

Y puedo comprobar si está presente - y si es así me muestro un mensaje de error y cerrar la aplicación:

bool IsAnotherInstanceRunning() 
    { 
     if (mutex.WaitOne(TimeSpan.Zero, true)) 
      return (true); 
     else 
      return (false); 
    } 

El problema es si dos usuarios pueden iniciar sesión y abrir la aplicación al mismo tiempo, y IsAnotherInstanceRunning() devolverá falso.

¿Cómo puedo evitar esto?

+1

¿Cómo lo hace el módulo de terceros? ¿Has contactado con su apoyo? – SLaks

+0

A menos que sea un controlador de nivel kernel, es sorprendentemente difícil hacer Windows pantalla azul en estos días. ¿Qué demonios está haciendo ese módulo? –

+0

@BlueRaja: es bastante fácil de pantalla azul Windows desde el modo de usuario. ¿Alguna vez intentó matar a csrss.exe? –

Respuesta

30

Prefijo el nombre del mutex con "Global \". De http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx:

Si su nombre comienza con el prefijo "Global \", el mutex es visible en todos los sesiones de Terminal Server. Si su nombre comienza con el prefijo "Local \", el mutex solo está visible en la sesión del servidor de la terminal donde fue creado. En ese caso, un mutex independiente con puede existir el mismo nombre en cada una de las otras sesiones de servidor de terminal en el servidor . Si no especifica un prefijo cuando crea un mutex con nombre, toma el prefijo "Local \".

13

Cambie el nombre del mutex para comenzar con Global\.

Source

En un servidor que ejecuta Terminal Servicios, un mutex llamado sistema puede tener dos niveles de visibilidad. Si su nombre comienza con el prefijo "Global \", , el mutex es visible en todas las sesiones de servidor de la terminal . Si su nombre comienza en con el prefijo "Local \", el mutex es visible solo en la sesión del servidor de terminal donde fue creado. En ese caso , puede existir un mutex independiente con el mismo nombre en cada una de las otras sesiones de servidor de terminal en el servidor . Si no especifica un prefijo cuando crea un mutex con nombre, toma el prefijo "Local \". Dentro de una sesión del servidor de terminal , dos muteos cuyos nombres difieren solo por sus prefijos son mutexes independientes, y ambos son visibles para todos los procesos en la sesión del servidor de terminal. Es decir, los nombres de prefijo "Global \" y "Local \" describen el alcance del nombre mutex relativo a las sesiones del servidor de terminal , no relativas a los procesos.