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.
![]() | |
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:
![]() | |
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 | |
![[ukázka kódu]](images/tip.png)