sábado, 4 de julio de 2015

Receta C# No. 4-17: Garantizar la Ejecución de una Sola Instancia de una Aplicación

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Algunas aplicaciones que creemos sólo requerirán una sola instancia en ejecución. Este tipo requerimiento puede generarse en una aplicación de cómputo intensivo en donde sóla una instancia por estación de trabajo está permitido debido a los límites del hardware, por ejemplo. Veremos que a nivel programático podemos aplicar esta restricción a través de la técnica de exclusión mutúa. Para ello, como ya veremos, el lenguaje de programación C# provee la clase System.Threading.Mutex.

1. Problema

Debemos asegurarnos que un usuario de un sistema operacional sólo pueda ejecutar una única instancia de una aplicación. Esto con el propósito de hacer uso eficiente de los recursos de cómputo locales y el acceso a datos para una cuenta de usuario.

2. Solución

C# cuenta con la construcción Mutex (namespace System.Threading) para este cometido. En esencia, a través del mecanismo de exclusión mutua que provee Mutex, es posible controlar la adquisición del espacio de ejecución por parte de una única instancia.

3. Discusión de la Solución

Para no extendernos en esta sección recomiendo al lector dirigirse a la receta Receta C# No. 4-9: Sincronización de Múltiples Threads usando Mutex y leer cuidadosamente los ejemplos de uso de la clase Mutex [3].

4. Práctica: Código Fuente C#

Creamos un ejemplo que haga uso de la Mutex para controlar la ejecución de una única instancia llamada UnicaInstancia. Cualquier intento de ejecución del assembly ejecutable mostrará al usuario un mensaje de advertencia que una instancia ya se halla en ejecución y enseguida finalizará.


En las líneas 8-40 se efectúan las siguientes operaciones:
  • Línea 12: declaración variable booleana para controlar si un objeto Mutex tiene control exclusivo sobre la ejecución de una aplicación.
  • Línea 16: Creación de una instancia de Mutex con using con la firma Mutex(Boolean, String, Boolean) [4]. El primer argumento del constructor indica que el thread inicial toma control exclusivo sobre la aplicación con nombre UnicaAplicacion.

    El tercer argumento controla si ya existe una instancia de esta aplicación en ejecución.
  • Línea 19: Comprueba si la aplicación ya se haya en ejecución, en caso de ser así se mostrará el mensaje de la línea 21. Para finalizar la aplicación es necesario presionar Enter, esto permitirá que otra instancia se ejecute y tome el control a través de un objeto Mutex.
  • Línea 29: Muestra mensaje en caso de que la aplicación ya se encuentre en ejecución.

Compilación:


  1. csc /target:exe UnicaInstanciaAplicacion.cs

Ejecución assembly:


  1. .\UnicaInstanciaAplicacion.exe

> Prueba de ejecución (local):
Ejecución assembly UnicaInstanciaAplicacion.exe
Figura 1. Ejecución assembly UnicaInstanciaAplicacion.exe.

5. Conclusiones

Esta receta nos ha mostrado los esenciales para restringir la ejecución de una aplicación por una sola instancia. La solución fue usar la versión sobrecargada del constructor de Mutex con la firma Mutex(Boolean, String, Boolean).


Con esta receta terminamos la serie de Recetas C# dedicadas a threads, processo, y sincronización. La siguiente serie estará centrada en archivos, directorios y entrada/salida.

6. Glosario

  • Exclusión mutua
  • Instancia
  • Mutex
  • Thread

7. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: Receta C# No. 4-9: Sincronización de Múltiples Threads usando Mutex - http://ortizol.blogspot.com/2014/07/receta-csharp-no-4-9-sincronizacion-de-multiples-threads-usando-mutex.html
[3]: Mutex Class (System.Threading) - https://msdn.microsoft.com/en-us/library/vstudio/system.threading.mutex(v=vs.100).aspx
[4]: Mutex Constructor (Boolean, String, Boolean) (System.Threading) - https://msdn.microsoft.com/en-us/library/vstudio/bwe34f1k(v=vs.100).aspx


J

1 comentario:

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.