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 |