131 votes

Empêcher les instances multiples d'une application donnée dans .NET ?

Dans .NET, quel est le meilleur moyen d'empêcher l'exécution simultanée de plusieurs instances d'une application ? Et s'il n'existe pas de "meilleure" technique, quelles sont les mises en garde à prendre en compte pour chaque solution ?

158voto

ImJustPondering Points 670

Utilisez Mutex. L'un des exemples ci-dessus utilisant GetProcessByName comporte de nombreuses mises en garde. Voici un bon article sur le sujet :

http://odetocode.com/Blogs/scott/archive/2004/08/20/401.aspx

[STAThread]
static void Main() 
{
   using(Mutex mutex = new Mutex(false, "Global\\" + appGuid))
   {
      if(!mutex.WaitOne(0, false))
      {
         MessageBox.Show("Instance already running");
         return;
      }

      Application.Run(new Form1());
   }
}

private static string appGuid = "c0a76b5a-12ab-45c5-b9d9-d693faa6e7b9";

1 votes

L'utilisation d'un mutex fonctionne également pour le code non .net (bien que la syntaxe soit différente).

9 votes

Voici une version un peu plus étoffée, avec quelques bons commentaires : stackoverflow.com/questions/229565/

2 votes

@ClarkKent : Juste une chaîne aléatoire pour que le nom du Mutex n'entre pas en collision avec le nom d'une autre application.

25voto

Thomas Wagner Points 1633
if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1)
{
  AppLog.Write("Application XXXX already running. Only one instance of this application is allowed", AppLog.LogMessageType.Warn);
  return;
}

1 votes

Je pense que vous devriez voir ça : odetocode.com/blogs/scott/archive/2004/08/20/

0 votes

@SubmarineX Comment êtes-vous sûr que cet article est correct ? Il y a toujours controverse entre mutex et codeproject.com/Articles/4975/

0 votes

Incroyable Juste parfait merci pour votre temps et vos efforts

22voto

Terrapin Points 15061

Voici le code dont vous avez besoin pour vous assurer qu'une seule instance est en cours d'exécution. C'est la méthode d'utilisation d'un mutex nommé.

public class Program
{
    static System.Threading.Mutex singleton = new Mutex(true, "My App Name");

    static void Main(string[] args)
    {
        if (!singleton.WaitOne(TimeSpan.Zero, true))
        {
            //there is already another instance running!
            Application.Exit();
        }
    }
}

2 votes

Pour une application WPF, utilisez Application.Current.Shutdown() ; Cette méthode fonctionne comme un charme. Merci Terrapin.

0 votes

Ici, l'essentiel est de rendre le mutex statique. De même que dans l'autre cas, la GC le collectera.

0 votes

J'ai apprécié la simplicité et la clarté du Mutex nommé. Ce code est concis et efficace.

7voto

bdukes Points 54833

Hanselman a un poste sur l'utilisation de la classe WinFormsApplicationBase de l'assemblage Microsoft.VisualBasic pour ce faire.

0 votes

Je l'utilise depuis quelques années, mais je cherche maintenant à passer à une solution basée sur Mutex. J'ai des clients qui signalent des problèmes à ce sujet et je soupçonne l'utilisation de Remoting pour le faire.

5voto

C. Dragon 76 Points 5066

Il semble qu'il y ait 3 techniques fondamentales qui ont été suggérées jusqu'à présent.

  1. Dérivez de la classe Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase et définissez la propriété IsSingleInstance sur true (je crois qu'une mise en garde ici est que cela ne fonctionnera pas avec les applications WPF, n'est-ce pas ?)
  2. Utilise un mutex nommé et vérifie s'il a déjà été créé.
  3. Obtenir une liste des processus en cours et comparer les noms des processus. (Cette méthode présente l'inconvénient d'exiger que le nom de votre processus soit unique par rapport à tous les autres processus en cours d'exécution sur la machine d'un utilisateur donné).

Des mises en garde que j'aurais oubliées ?

3 votes

Je ne pense pas que le 3 soit très efficace. Je voterais pour le Mutex, je l'ai utilisé sans problème à plusieurs reprises. Je n'ai jamais utilisé le point 1, je ne suis pas sûr que cela fonctionne quand on est en C#.

2 votes

L'option 1 fonctionne toujours avec WPF, c'est juste un peu plus compliqué. msdn.microsoft.com/fr/us/library/ms771662.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X