Ejecutar una sólo instancia de la aplicación

2020 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.



vbnet
  1. Imports System.Threading
  2.  
  3. Class SingleInstanceApp
  4.     Implements IDisposable
  5.  
  6.     Private _siMutex As Mutex
  7.     Private _siMutexOwned As Boolean
  8.  
  9.     Public Sub New(ByVal name As String)
  10.         _siMutex = New Mutex(False, name)
  11.         _siMutexOwned = False
  12.     End Sub
  13.  
  14.     Public Function IsRunning() As Boolean
  15.         _siMutexOwned = _siMutex.WaitOne(0, True)
  16.         Return Not (_siMutexOwned)
  17.     End Function
  18.  
  19.     Public Sub Dispose() Implements System.IDisposable.Dispose
  20.         If _siMutexOwned Then
  21.             _siMutex.ReleaseMutex()
  22.         End If
  23.     End Sub
  24.  
  25. End Class



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



vbnet
  1. Shared Sub Main()
  2.     Dim app As SingleInstanceApp = New SingleInstanceApp("{123456789 - ABCD - EFEG - XXXX}")
  3.     Try
  4.         If app.IsRunning Then
  5.             MessageBox.Show("Application déjà lancée")
  6.         Else
  7.             Application.Run(New Form1)
  8.         End If
  9.     Finally
  10.         CType(app, IDisposable).Dispose()
  11.     End Try
  12. End Sub



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.