Taller de Programación

Los eventos en c#

Después de haber estado viendo los delegados, el siguiente paso, son los eventos, que en C# es el modo que tiene una clase de proporcionar notificaciones a los clientes de la clase cuando ocurre algo digno de reseñar en un objeto. Un ejemplo de ello, es cuando un usuario hace click en un botón.

Los eventos tienen las siguienes propiedades:

  • El publicador determina el momento en el que se genera un evento; los suscriptores determinan la acción que se lleva a cabo en respuesta al evento.
  • Un evento puede tener varios suscriptores. Un suscriptor puede controlar varios eventos de varios publicadores.
  • Nunca se generan eventos que no tienen suscriptores.
  • Los eventos se suelen usar para indicar acciones del usuario, como los clics de los botones o las selecciones de menú en las interfaces gráficas de usuario.
  • Cuando un evento tiene varios suscriptores, los controladores de eventos se invocan sincrónicamente cuando se genera un evento.
  • En la biblioteca de clases .NET Framework , los eventos se basan en el delegado EventHandler y en la clase base EventArgs .

Para declarar un evento, se usa la palabra “event”, como habras visto, WorkPerformedHandler es un delegado, el mismo que usamos en el post anterior.

1
     public event WorkPerformedHandler WorkPerformed;

Para probar los eventos crearemos una clase Worker donde añadiremos dos eventos, uno usa una custom delegate y otro usara EventHandler.

1
2
3
4
5
6
7
8
9
10
11
12
    public delegate int WorkPerformedHandler(int hours, int type);

    public class Worker
    {
        public event WorkPerformedHandler WorkPerformed;
        public event EventHandler WorkCompleted;

        public void DoWork(int hours, int type)
        {

        }
    }

Lanzando el evento

Una de las primeras cosas que hay que comprobar que haya algun metodo que se haya suscrito al evento, si no lo hicieramos y nadie se hubiese suscrito a ese evento, daria una excepción. Esto se puede hacer de dos maneras, ambas son correctas:

  • Comprobar si el evento es diferente a Null, si lo es, es que alguien se ha suscrito por lo que podemos ejecutarlo.
1
2
3
4
  if(WorkPerformed != null)
    {
      WorkPerformed(hours, type);
    }   
  • Instanciamos el delegado, y comprobamos si es diferente a null, si es asi, lo ejecutamos.
1
2
3
4
5
   WorkPerformedHandler del = WorkPerformed as WorkPerformedHandler;
    if(del != null)
     {
       del(hours, type);
      }

Ahora crearemos un metodo que se ejecutara cuando se lance el evento, No es obligatorio que empiece por On pero si que en .NET se suele usar esta nomenclatura.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   protected virtual void OnWorkedPerformed(int hours, int type)
        {
            WorkPerformedHandler del = WorkPerformed as WorkPerformedHandler;
            if (del != null)
            {
                del(hours, type);
            }
        }

     protected virtual void OnWorkCompleted()
        {
            var del = WorkCompleted as EventHandler;
            if (del != null)
            {
                del(this,EventArgs.Empty);
            }
        }

Y ahora llamaremos a estos dos eventos desde el metodo DoWork

1
2
3
4
5
6
7
8
public void DoWork(int hours, int type)
   {
    for (int i = 0; i < hours; i++)
        {
          OnWorkedPerformed(i + 1, type);
        }
    OnWorkCompleted();
   }      

Y como siempre el codigo completo aqui:

  • Programacion (5)
  • Eventos (3)
  • Webservices (2)
  • Patrones (1)