11. Události

Zpracování událostí je v zásadě proces, kdy jeden objekt dokáže upozornit další objekty na to, že došlo k nějaké změně (události). Systém událostí v jazyce C# interně využívá delegátů. Na tyto delegáty jsou kladeny tyto podmínky:

  • delegát musí mít dva parametry a oba jsou objekty;

  • první udává kdo je zdrojem události;

  • druhý obsahuje informace spojené s konkrétní událostí. Tento objekt musí rozšiřovat třídu EventArgs.

Využití delegátu a událostí demonstruje následující příklad. Jde o implementaci jednoduchého příkladu:

  • Výrobce vytváří zboží. Tento proces je by ve skutečnosti mohl být asynchronní. Aplikace by pak měla více vláken...

  • V případě, že je zboží hotové, jsou upozorněni zaregistrovaní zákaznici.

[ukázka kódu]
class InfoEventArgs : EventArgs 
{
  private string info;
  public InfoEventArgs(string info)
  {
    this.info=info;
  }
  public string Info
  {
    get {return info;}
  }  
}
class Producer
{
  string name;
  public Producer(string name) 
  {
    this.name=name;
  }
  public string Name
  {
    get {return name;}
  }
  public  delegate void WantToKnow(Producer source,InfoEventArgs args);
  public event WantToKnow ItemProduced;
  public void Produce(string productName) 
  {
    Console.WriteLine("Production of "+productName+" started.");
    InfoEventArgs info=new InfoEventArgs(productName);
    Console.WriteLine("Production of "+productName+" ended.");
    if (ItemProduced!=null) ItemProduced(this,info); //vyvolání události
  }
}
class Customer
{
  string name;
  public Customer(string name,Producer producer) 
  {
    this.name=name; 
    producer.ItemProduced+=new Producer.WantToKnow(NewItemProduced);//registrace
  }
  public void NewItemProduced(Producer producer,InfoEventArgs info) //skutečná obsluha události
  {
    Console.WriteLine(this.name+": "+producer.Name+" produce item:"+info.Info);
  }
}
class RunApp
{
  public static void Main()
  {
    Producer producer=new Producer("Haven inc.");
    Customer marek=new Customer("Marek",producer);
    Customer tom=new Customer("Tom",producer);

    producer.Produce("Ferrari");
    producer.Produce("pencil");
    producer.Produce("cake");
  }
}

Události fungují jako jakýsi sběrný bod pro konkrétní delegáty. V případě, že někdo tuto událost vyvolá, jsou spuštění všichni zaregistrovaní delegáti.

Výstupem předcházejícího programu bude:

[ukázka kódu]
Production of Ferrari started.
Production of Ferrari ended.
Marek: Haven inc. produce item:Ferrari
Tom: Haven inc. produce item:Ferrari
Production of pencil started.
Production of pencil ended.
Marek: Haven inc. produce item:pencil
Tom: Haven inc. produce item:pencil
Production of cake started.
Production of cake ended.
Marek: Haven inc. produce item:cake
Tom: Haven inc. produce item:cake