2010-05-13 7 views
19

Meine App ist gezwungen, ein 3rd-Party-Modul zu verwenden, das Windows blendet, wenn zwei Instanzen gleichzeitig auf demselben Computer gestartet werden. Zu arbeiten, um das Problem, meine C# app hat eine Mutex:Cross-Benutzer C# Mutex

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

Und ich überprüfen, ob es vorhanden ist - und wenn ja, zeige ich eine Fehlermeldung und schließen Sie die App:

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

Das Problem ist, Wenn sich zwei Benutzer gleichzeitig anmelden und die Anwendung öffnen können, gibt IsAnotherInstanceRunning() false zurück.

Wie kann ich das umgehen?

+1

Wie macht das 3rd-Party-Modul das? Hast du ihre Unterstützung kontaktiert? – SLaks

+0

Wenn es sich nicht um einen Kernel-Level-Treiber handelt, ist es erstaunlich schwierig, Windows in diesen Tagen zu einem Bluescreen zu machen - was macht dieses Modul auf der Welt? –

+0

@BlueRaja: Es ist ziemlich einfach, Windows aus dem Benutzermodus zu blenden. Haben Sie jemals versucht, csrss.exe zu töten? –

Antwort

30

Setzen Sie den Namen des Mutex mit "Global \" voran. Von http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx:

Wenn der Name mit dem Präfix "Global \" beginnt, ist der Mutex in allen Terminal-Server-Sitzungen sichtbar. Wenn der Name mit dem Präfix "Local \" beginnt, ist der Mutex nur in der Serversitzung des Terminals sichtbar, in der er erstellt wurde. In diesem Fall kann ein separater Mutex mit dem gleichen Namen in den anderen Terminalserver-Sitzungen auf dem Server vorhanden sein. Wenn Sie beim Erstellen eines benannten Mutex kein Präfix angeben, wird das Präfix "Local \" verwendet.

13

Ändern Sie den Mutexnamen so, dass er mit Global\ beginnt.

Source

Auf einem Server, auf dem Terminal Services, ein System namens Mutex haben zwei Ebenen der Sichtbarkeit läuft. Wenn der Name mit dem Präfix "Global \", beginnt, ist der Mutex in allen Server-Sitzungen des Terminals sichtbar. Wenn der Name mit dem Präfix "Local \" beginnt, ist der Mutex nur in der Terminalserver Sitzung sichtbar, in der er erstellt wurde. In diesem Fall kann ein separater Mutex mit demselben Namen in jeder der anderen Terminalserver-Sitzungen auf dem Server existieren. Wenn Sie beim Erstellen eines benannten Mutex kein Präfix angeben, wird das Präfix "Local \" verwendet. In einer Terminalserversitzung sind zwei Mutexe , deren Namen sich nur durch ihre Präfixe unterscheiden, separate Mutexe und beide sind für alle Prozesse in der Terminalserver-Sitzung sichtbar. Das heißt, die Präfixnamen "Global \" und "Local" beschreiben den Geltungsbereich des Mutex-Namens relativ zu Terminalserver Sitzungen, nicht relativ zu Prozessen.