2010-05-13 6 views
19

Mon application est obligée d'utiliser un module tiers qui bloque Windows si deux instances sont démarrées en même temps sur la même machine. Pour contourner le problème, mon application C# a un mutex:utilisateur croisé C# mutex

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

Et je vérifie si elle est présente - et si oui je montre un message d'erreur et fermer l'application:

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

Le problème est si deux utilisateurs peuvent se connecter et ouvrir l'application en même temps, et IsAnotherInstanceRunning() retournera false.

Comment puis-je contourner ce problème?

+1

Comment le module tiers fait-il cela? Avez-vous contacté leur support? – SLaks

+0

À moins qu'il ne s'agisse d'un pilote au niveau du noyau, il est étonnamment difficile de faire de Windows un écran bleu de nos jours - que fait ce module dans le monde? –

+0

@BlueRaja: Il est assez facile de Windows en mode utilisateur. Avez-vous déjà essayé de tuer csrss.exe? –

Répondre

30

Préfixez le nom du mutex avec "Global \". De http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx:

Si son nom commence par le préfixe "Global \", le mutex est visible dans toutes les sessions Terminal Server . Si son nom commence par le préfixe "Local \", le mutex est visible uniquement dans la session du terminal où il a été créé. Dans ce cas, un mutex distinct avec du même nom peut exister dans chacune des autres sessions de serveur terminal sur le serveur . Si vous ne spécifiez pas de préfixe lorsque vous créez un mutex nommé, le prend le préfixe "Local \".

13

Modifiez le nom du mutex pour commencer par Global\.

Source

Sur un serveur qui exécute Terminal Services, un mutex système nommé peut avoir deux niveaux de visibilité. Si son nom commence par le préfixe "Global \", le mutex est visible dans toutes les sessions du serveur . Si son nom commence avec le préfixe "Local \", le mutex est visible uniquement dans la session du serveur Terminal Server où il a été créé. Dans ce cas , un mutex distinct avec le même nom peut exister dans chacune des autres sessions de serveur terminal sur le serveur . Si vous ne spécifiez pas de préfixe lorsque vous créez un mutex nommé, le prend le préfixe "Local \". Dans une session de serveur terminal , deux mutex dont les noms ne diffèrent que par leurs préfixes sont des mutex distincts et sont tous deux visibles par tous les processus de la session du serveur Terminal Server. C'est-à-dire les noms de préfixe "Global \" et "Local" décrivent la portée du nom de mutex par rapport aux sessions de serveur terminal , non par rapport aux processus.