Ejecutar una sólo instancia de la aplicación

3053 vistas

Puede que queramos evitar ejecutar más de una vez nuestra aplicación. Veamos una pequeña clase que en el momento de la ejecución se asegura que no exista ninguna otra ejecutándose.

Esta clase usa un objeto mutex visible a los demás procesos.



csharp
  1. using System.Threading;
  2. class SingleInstanceApp : IDisposable
  3. {
  4.     // Mutex
  5.     Mutex _siMutex;
  6.     bool _siMutexOwned;
  7.  
  8.     // Constructor
  9.     public SingleInstanceApp(string name)
  10.     {
  11.         _siMutex = new Mutex(false, name);
  12.         _siMutexOwned = false;
  13.     }
  14.  
  15.     // Controla su la app está lanzada
  16.     public bool IsRunning()
  17.     {
  18.         // cogemos el mutex
  19.         // Si _siMutexOwned es tru, la aplicación coge el mutex ya que está "libre"
  20.         // Sino, el mutex ya ha sido adquirido en una ejecución anterior
  21.         _siMutexOwned =  _siMutex.WaitOne(0, true);
  22.         return !(_siMutexOwned);
  23.     }
  24.  
  25.     // IDisposable
  26.     public void Dispose()
  27.     {
  28.         // liberación el mutexsi ha sido adquirido
  29.         if (_siMutexOwned)
  30.             _siMutex.ReleaseMutex();
  31.     }
  32. }



Para usar la clase, simplemente tendremos que hacer lo siguiente: en el Main de nuestra aplicación....



csharp
  1. static void Main()
  2. {
  3.     // Usando using, app.Dispose() se llama automáticamente
  4.     using (SingleInstanceApp app = new SingleInstanceApp("{123456789 - ABCD - EFEG - XXXX}"))
  5.     {
  6.         if (app.IsRunning())
  7.             MessageBox.Show("Aplicación ya en curso");
  8.         else
  9.             Application.Run(new Form1());
  10.     }
  11. }



Importante:

Si una aplicación lambda en ejecución crea un mutex que tenga el mismo nombre que el de nuestra aplicación, ésta no podrá ser ejecutada. Será preferible, pues, escoger un nombre complejo para nuestro mutex.