locked
Comment vérifier qu'une seule instance de l’application est en cours d’exécution à un moment RRS feed

  • Question

  • Le meilleur moyen d'accomplir cela est à l'aide d'un mutex nommé. Créer le mutex à l'aide du code tel que :

     

     bool premiereInstance;
    
        Mutex mutex = new Mutex(false, "Local\\" + 
    
                       unNomUnique, out premiereInstance);
    
        // Si premiereInstance n'est pas = true, on est la premiere instance de l'application;
    
        // sinon, une autre instance existe deja
    
    

     

     

    Notez que le mutex est local, ce qui signifie qu'il est dans la session de l'utilisateur actuel. Sans la partie Local, d’autres utilisateurs pourraient partager le mutex, afin que deux utilisateurs différents ne puissent pas exécuter le programme en même temps. Notez également que (contrairement aux divers échantillons autour du net), ce code n’a pas un appel à ReleaseMutex. C'est parce que le mutex est automatiquement supprimé  lorsque le processus finit, qui est généralement le comportement désiré.

     

    Méfiez-vous d'une chose est que le mutex n'est pas récupéré par le garbage collector. Si une variable locale est uniquement utilisée au début d'une méthode, le garbage collector peut l’ignorer quand il etablit quelles variables sont des "racines" garbage collection si cette partie de la méthode a déjà été exécutée. Cela peut entraîner le mutex d’être libéré plus tôt qu’anticipé. Pour empêcher cela, on fait un appel à GC.KeepAlive (mutex); à la fin de la méthode main. Alternativement, on peut utiliser une variable statique pour stocker le mutex. Cela garantira que le mutex n'est pas récupéré par le garbage collector jusqu'à ce que l’AppDomain soit déchargé. (De cette manière, même si main finit, on n’aura aucun problème si d'autres threads s’exécutent.)

     

     

     

    Une autre façon de s'attaquer au problème (ce qui est fourni avec ses propres questions) est d’écouter sur un port local. Comme un seul processus peut écouter sur n'importe quel port particulier, ceci assurera qu'aucune autre instance de votre application n'est en cours d'exécution. Toutefois, si une autre application souhaite utiliser ce port ainsi, votre application va penser qu'il existe une autre instance en cours d'exécution, soit l'autre application est susceptible d'un dysfonctionnement.

     

     

     

    Notez que cette approche a l'avantage de fournir un canal de communication entre l'instance "principale" et l'instance nouvellement créé. Par exemple : si l'instance nouvellement créé veut dire à l'instance principale d’ouvrir un fichier que l'utilisateur a simplement demandé, il peut le faire à l'aide du socket.


    Pour plusieurs questions sur la bibliothèque de classes .NET, visitez Foire aux Questions  -  Bibliothèque de classes .NET Framework




    Alex Petrescu - MSFT
        
    mardi 23 février 2010 15:08
    Modérateur