Cómo crear hilos (thread) en una aplicación de consola C# por código. Y cómo ejecutar un proceso repetidas veces usando un temporizador (también por código). Usaremos Visual Studio .Net Community 2019. A modo dec ejemplo, crearemos una aplicación completa que lee comandos de un chat de Telegram (Bot) y realiza operaciones en función del comando recibido. Además, ejecuta un hilo independiente, que se ejecuta cada 3 minutos, y envía un mensaje a un chat de Telegram, obteniendo la información del mensaje de una base de datos MySQL.

Requisitos de la aplicación de ejemplo en C# para multi-hilo y repetición de proceso

Como ejemplo, desarrollamos una aplicación de consola en C# que pretendemos que haga lo siguiente:

  • Por un lado debe permanecer escuchando mensajes de un Bot de Telegram. Cuando recibe algún mensaje realiza una operación en función del mensaje (comando).
  • Por otro lado, la misma aplicación, cada 3 minutos, queremos que ejecute otro proceso que lea en una base de datos MySQL envíe un mensaje a un chat de Telegram, con información obtenida del servidor de MySQL.

Como vemos, en una misma aplicación de consola queremos que se ejecuten dos procesos diferenciados, que no tienen nada que ver el uno con el otro. Para ello usaremos thread de C# y, queremos que uno de los procesos se ejecute cada 3 minutos, para ello usaremos un temporizador (Timer).

Realizaremos todo desde el código fuente C#, sin usar componentes visuales, en una aplicación de consola.

Para el desarrollo de la aplicación usaremos el IDE gratuito Visual Studio Community .Net 2019 y usaremos el lenguaje de programación C# (C Sharp).

La aplicación de ejemplo usará varias tablas de MySQL, que deben existir: usuario, incidencia y parámetros. A continuación se indican los campos mínimos de estas tablas MySQL, que se usan para hacer consultas SQL en la aplicación:

  • La tabla usuario tendrá, al menos, los siguientes campos:
    • idChatTelegram: de tipo long (entero largo), almacenará el ID del chat de Telegram al que se enviarían posibles mensajes.
    • idTelegram: int (enterio), ID del usuario de Telegram.
    • nombre: de tipo string (texto), nombre completo del usuario.
    • email: de tipo string (texto), email del usuario.
    • fecharegistro: de tipo datetime (fecha-hora), fecha y hora de registro del usuario.
  • La tabla parametros tendrá, al menos, los campos:
    • nombre: de tipo string (texto), nombre del parámetro.
    • valor: de tipo string (texto), valor del parámetro.
  • La tabla incidencia tendrá, al menos, los siguientes campos:
    • resueltatecnico: de tipo string (texto), tendrá valor «S» si está resuelta la incidencia y «N» si está pendiente de resolver.

Crear el proyecto C# de aplicación de consola en Visual Studio .Net Community 2019

En primer lugar crearemos un proyecto de consola, de C#, en Visual Studio .Net Community:

Crear el proyecto C# de aplicación de consola en Visual Studio .Net Community 2019

Introduciremos el nombre para el proyecto, así como la carpeta donde se guardarán los ficheros, por ejemplo «ProyectoA_MultiHiloCSharp»:

Crear el proyecto C# de aplicación de consola en Visual Studio .Net Community 2019

No es objeto de este artículo explicar cómo enviar y recibir mensajes desde un chat/bot de Telegram. Para leer mensajes a un bot de Telegram seguiremos los pasos que indicamos en el siguiente artículo:

Tampoco es objeto de este artículo explicar cómo conectar desde una aplicación C# a una base de datos MySQL/MariaDB. Para leer de una base de datos MySQL desde C# seguiremos los pasos que indicamos en el siguiente artículo:

Necesitaremos agregar las referencias para la DLL de Telegram Telegram.Bot.dll, que debemos haber descargado y, en nuestro caso, la colocaremos en la carpeta bin de nuestro proyecto, donde tendremos el ejecutable. Para agregarla, pulsaremos en el menú «Proyecto» – «Agregar referencia…». En el Administrador de referencias, examinaremos y agregaremos la DLL Telegram.Bot.dll:

Crear el proyecto C# de aplicación de consola en Visual Studio .Net Community 2019

También agregaremos la referencia a la DLL de MySQL MySql.Data.dll, de la misma forma:

Crear el proyecto C# de aplicación de consola en Visual Studio .Net Community 2019

Otra referencia a DLL que necesitaremos es Newtonsoft.Json.dll:

Crear el proyecto C# de aplicación de consola en Visual Studio .Net Community 2019

Agregaremos otras referencias necesarias para este proyecto, como System.Configuration:

Crear el proyecto C# de aplicación de consola en Visual Studio .Net Community 2019

Todas las DLL anteriores se incluyen en la descarga de la aplicación de ejemplo y su código fuente.

Clase para escribir en fichero de log las acciones que se van realizando en la aplicación, también para mostrar en la ventana de consola

Crearemos una clase llamada EscribirLog en nuestro proyecto. Para ello pulsaremos con le botón derecho sobre la solución y en el menú emergente elegiremos «Agregar» – «Clase…»:

Clase para escribir en fichero de log las acciones que se van realizando en la aplicación, también para mostrar en la ventana de consola

La llamamos EscribirLog:

Y le agregamos el siguiente código fuente C#:

Esta clase escribirá el texto que se le pase como parámetro en un fichero de texto sin formato. También permitirá mostrar el texto por pantalla (en la ventana de consola de la aplicación).

Cuando realizamos una aplicación de consola o un servicio, es útil guardar lo que la aplicación va realizando, para posibles depuraciones posteriores y para recabar información de su funcionamiento.

Clase para cifrar y descifrar texto

Para guardar las contraseñas y demás datos sensibles en el fichero de configuración de la aplicación necesitaremos una clase que cifre/descifre un texto. La agregaremos al proyecto y la llamaremos CifrarDescifrarTexto. Dicha clase tendrá el siguiente código:

Clase para leer parámetros de configuración de un fichero XML

Necesitaremos una clase para leer los parámetros de configuración de la aplicación. Dichos parámetros se guardarán en el fichero XML de configuración. Algunos de los parámetros que se guardarán serán el nombre (IP) del servidor de MySQL/MariaDB al que nos conectaremos y sus datos de conexión: puerto, usuario y contraseña. La contraseña irá cifrada empleando la clase anterior, de forma que si alguien accede al fichero de configuración de la aplicación, aunque vea sus datos, no podrá saber la contraseña de conexión con el servidor.

Agregaremos la clase para leer/escribir parámetros de configuración, que llamaremos LeerGuardarDatosConfiguracion y le añadiremos el siguiente código fuente:

Clase para acceder a servidor de base de datos MySQL Server (válido para MariaDB)

Para trabajar con el servidor de MySQL/MariaDB y poder acceder a las tablas de este servidor, crearemos una clase en nuestro proyecto, como hemos hecho para la clase anterior, llamándola BD (BD.cs). Esta clase tendrá el siguiente código C#:

Clase para leer los comandos recibidos desde el Bot de Telegram

Agregaremos una clase a nuestro proyecto que contendrá los posibles comandos que la aplicación entenderá, para realizar la operación asignada al comando leído. Estableceremos el nombre de la clase, en nuestro caso Comandos.

La clase Comandos (Comandos.cs) tendrá el siguiente código fuente C#:

Programa principal Program Main

Una vez que hemos agregado todas las clases y referencias necesarias, como hemos indicando anteriormetne, agregaremos el código fuente al programa principal (Program), a la clase Main, que será la primera que se ejecute cuando se abra la aplicación de consola.

El el programa principal de nuestra aplicación, en el fichero Program.cs, tendrá el siguiente código, para que la aplicación de consola permanezca siempre abierta, escuchando mensajes de un bot de Telemgram y para que, también, cada 3 minutos lea en una base de datos MySQL y realice otras operaciones:

Ejecutando la aplicación de consola que abre varios hilos y lee y envía mensajes a Bot de Telegram

En primer lugar generaremos el ejecutable de la aplicación. Desde Visual Studio .net, pulsaremos en el menú «Compilar» – «Volver a generar ProyectoA_MultiHiloCSharp»:

Ejecutando la aplicación de consola que abre varios hilos y lee y envía mensajes a Bot de Telegram

Nos generará un ejecutable en la carpeta …/bin de nuestro proyecto. Antes de ejecutar la aplicación, deberemos editar el fichero de configuración ProyectoA_MultiHiloCSharp.exe.config y establecer los parámetros de conexión a la base de datos MySQL/MariaDB:

Una vez establecidos los parámetros, únicamente tendremos que hacer doble clic sobre el ejecutable para abrir la aplicación:

Ejecutando la aplicación de consola que abre varios hilos y lee y envía mensajes a Bot de Telegram

La aplicación conectará con el API de Telegram, identificará el Bot con su ID y su token de seguridad y permanecerá a la escucha de mensajes. Si se escribe un mensaje al bot de Telegram, la aplicación lo leerá. Y si el mensaje recibido coincide con algún comando de los que conoce, realizará la operación asignada. Los posibles comandos:

  • cifrar texto: cifrará el texto indicado «texto» y enviará un mensaje con el texto cifrado.
  • descifrar texto: realiza la operación inversa a la anterior.
  • usuario: accede a la base de datos MySQL y obtiene el email, el nombre y la fecha de registro del usuario. Lo filtra por el ID de Telegram (que deberá existir en la tabla de usuario).
  • hola: devuelve un mensaje con los comandos que reconoce el programa para el bot de Telegram.

Además de reconocer comandos, la aplicación ejecuta un proceso, cada 3 minutos, que lee de la base de datos de MySQL las incidencias pendientes de resolver de un técnico (usuario), filtrando por su ID de Telegram y envía un mensaje al chat del bot de Telegram con el número de incidencias.

La aplicación de consola irá mostrando las acciones que va ejecutando, para depurar:

Ejecutando la aplicación de consola que abre varios hilos y lee y envía mensajes a Bot de Telegram

La aplicación de Telegram, una vez ejecutados algunos comandos y una vez recibido algún mensaje con las incidencias pendientes de un técnico, tendrá este aspecto:

Ejecutando la aplicación de consola que abre varios hilos y lee y envía mensajes a Bot de Telegram

Descargar aplicación completa y código fuente en C#

A continuación dejamos el enlace a la descarga de la aplicación de ejemplo completa con el código fuente y todas las DLL necesarias: