Esperar evento en C#

Naila Saad Siddiqui 15 febrero 2024
  1. Eventos en C#
  2. Esperar un Evento en C#
Esperar evento en C#

Este artículo de programación presentará brevemente los eventos en C# y luego avanzará hacia la espera de un evento en C#.

Eventos en C#

Los eventos permiten que las clases y los objetos alerten a otras clases y objetos cuando suceden ciertas cosas. La clase de publicador envía el evento y las clases que lo reciben o lo manejan se conocen como suscriptores.

Algunos eventos se declaran de forma predeterminada, como clics de botones, eventos del mouse (movimiento del mouse, clic, doble clic, etc.), eventos del teclado y muchos otros. Pero también puede declarar sus eventos.

Controladores de eventos

Los controladores de eventos son las funciones que se llaman cuando ocurre un evento. Estos controladores se llaman automáticamente cuando ocurre ese evento y realizan su acción.

Se pueden conectar varios controladores de eventos a un evento y, cuando ocurra el evento, se llamarán a todos de forma síncrona. Los eventos que alertan a los clientes sobre el cambio de estado de un objeto también pueden ser manejados por controladores de eventos.

Entonces, podemos decir que los controladores de eventos se llaman cuando se activa un evento, y puede indicarle al código lo que debe hacer cuando se activa ese evento en la función del controlador de eventos.

Esperar un Evento en C#

Las cosas son muy simples cuando necesita llamar a una función en el fuego de un evento. Por ejemplo, debe llamar a una función cuando se hace clic en un botón.

Cuando finaliza otro evento, las cosas se complican cuando necesitas llamar a la función. Esto significa que debe hacer que un controlador de eventos espere hasta que otro evento complete su tarea.

Demostremos esto con un ejemplo simple: dos botones y un campo de texto. Necesitamos hacer clic en el primer botón, y cuando se hace clic en este botón, debemos dar el "Texto de bienvenida" en el campo de texto, pero mostrar ese texto cuando también se hace clic en el segundo botón.

Primero crearemos un formulario en una aplicación de formulario de Windows y le pondremos tres controles, 2 botones y un campo de texto como la siguiente imagen.

muestra de los controles de formulario de ventana

Necesitamos completar el campo de texto cuando se hace clic en “botón1” y “botón2”. Para realizar esta tarea, debemos esperar en el controlador de botón1 para que botón2 termine su tarea y luego establecer el texto del campo de texto.

La función de controlador de eventos de button1 utilizará una clase TaskCompletionSource. Esta clase hará que el controlador del botón1 espere hasta que finalice el controlador del botón2.

Código:

TaskCompletionSource<bool> tcs = null;
private async void button1_Click(object sender, EventArgs e) {
  tcs = new TaskCompletionSource<bool>();
  label1.Text = "Click the Second Button";
  await tcs.Task;  // system will wait here
  textBox1.Text = "You are done! ThankYou";
}

Si necesitamos un método para esperar a otro método, declaramos ese método como async y luego lo hacemos await. Esto regresará en este punto cuando se complete la segunda tarea.

private void button2_Click(object sender, EventArgs e) {
  tcs.TrySetResult(true);
}

Para el segundo botón, cuando se hace clic en el botón, se llamará a la función de controlador anterior. Establecerá la finalización de la tarea como verdadera, indicando a la tarea esperada que la otra tarea se completó para que ejecute su función restante.

Producción:

Salida después de hacer clic en el primer botón

Cuando se hace clic en el primer botón, también da un mensaje para hacer clic en el segundo botón. Veamos qué sucede cuando se hace clic en el segundo botón.

salida cuando se hace clic en el segundo botón

Después de hacer clic en el segundo botón, el campo de texto muestra el texto que configuramos en la función de controlador del primer botón. Esto significa que la función de controlador del primer botón estaba esperando a que se hiciera clic en el segundo botón y luego terminaba de ejecutar su implementación restante.

De esta forma, podemos esperar a que un evento termine su tarea.

Artículo relacionado - Csharp Event