Krizsán Zoltán
Mi az? Aszinkron törtt rténésről értesítés s egy vagy több t objektum számára. Delegátumok segíts tségével valósítja meg a C#. 2
Lehetőségek 1. Egy objektum bejelentheti érdeklődését egy esemény iránt 2. Egy objektum visszavonhatja érdeklődését egy esemény iránt 3. Egy objektum eseményt definiálhat. 3
Példa Fax Nyomtató Definiál egy eseményt Értesítés az esemény bekövetkez éséről Levelező menedzser Bejelentik érdeklődésüket az esemény iránt Új üzenet érkezik 4
Az eseményt megosztó osztály tervezése I Esemény paramétereinek definiálása Osztály definiálása (neve vége v EventArg), őse a Systen.EventArgs 5
Az eseményt megosztó osztály Ajánl nlások: tervezése II Delegátum definiálása Neve: EventHandler végű void visszatérés 2 paraméter: Első: : küldk ldő objektum Második: paraméterek Ha nincs + paraméter, akkor használjuk a System.EventHandler-t,, aminek a 2. paramétere EventArgs.Empty legyen! 6
Az eseményt megosztó osztály tervezése III Esemény definiálása Az előzőleg leg definiált delegátum a típusa! Ismernie kell mind a kiterjesztő, mind az érdeklődő osztályoknak! Láthatósága általában publikus! Gyakran tulajdonságnak definiáljuk! 7
Az eseményt megosztó osztály tervezése IV Értesítő fv.. definiálása Protected, virtual Paramétere az esemény paramétere Neve On-al kezdődik dik és s a vége v az esemény neve! Ellenőrzi, hogy érdeklődik dik e e valaki az esemény iránt, majd meghívja azokat! 8
Az eseményt megosztó osztály tervezése V Észlelő fv.. definiálása 1. Észleli a várt v eseményt 2. Létrehozza az esemény paraméter osztály lyát Meghívja az értesítő fv.-t. 3. Megh 9
Példa kódjak class MailManager{ public class MailMsgEventArgs : EventArgs { public MailMsgEventArgs( String from, String to, String subject, String body){ this.from =from;this.to = to; this.subject =subject;this.bodythis.body =body; public readonly String from, to, subject, body; public delegate void MailMsgEventHandler(Object sender, MailMsgEventArgs args); public event MailMsgEventHandler MailMsg; protected virtual void OnMailMsg(MailMsgEventArgs MailMsgEventArgs e){ if (MailMsg!=null){ MailMsg(this this,, e); public void SimulateArrivingMsg(String String from, String to, String subject, String body){ MailMsgEventArgs e = new MailMsgEventArgs(from from, to, subject, body); OnMailMsg(e); 10
Mi is törtt rténik? public event MailMsgEventHandler MailMsg; Sor hatására: 1. Private delegátum adattag (linkelt lista feje) 2. Publikus add_ tagfv.. (System.Delegate.Combine( fv.-t hívja) 3. Publikus remove_ tagfv.. (System.Delegate.Remove( fv.-t hívja) jön n létre. l 11
Mi is törtt rténik? II private MailMsgEventHandler MailMsg = null; [MethodImplAttribute(MethodImplOptions.Synchronized)] public void add_mailmsg MailMsg(MailMsgEventHandlerMailMsgEventHandler handler) { MailMsg = (MailMsgEventHandler( MailMsgEventHandler) Delegate.Combine(MailMsg MailMsg, handler); [MethodImplAttribute(MethodImplOptions.Synchronized)] public void remove_mailmsg MailMsg(MailMsgEventHandlerMailMsgEventHandler handler) { MailMsg = (MailMsgEventHandler( MailMsgEventHandler) Delegate.Remove(MailMsg MailMsg, handler); 12
Az érdeklődő osztály tervezése 1. Definiáljunk legalább 3 tagfv.-t: Konstruktort Eseménykezel nykezelő Érdeklődést visszavonó (unregister) 2. Konstruktor: kapja meg a érdekelt eseményt küldk ldő osztályt! a fv.. végén v n jelentse be érdeklődését t az esemény iránt! operator+= Eseménykezel nykezelő,, ami átfordul xxx.add_ fv.. Hívásra. H 13
Az érdeklődő osztály tervezése II 3. Eseménykezel nykezelő fv. Paraméterszignat terszignatúrája meg kell egyezzen az esemény delegátum típusával! 4. Érdeklődést visszavonó (unregister) operator-= Eseménykezel nykezelő,, ami átfordul xxx.remove_ fv.. Hívásra. H Esetleg meghívhatja a Dispose-t is. 14
Példa kódja k Fax osztály class Fax{ public Fax(MailManager mm){ mm.mailmsg += new MailManager.MailMsgEventHandler(FaxMsg FaxMsg); private void FaxMsg(Object Sender, MailManager.MailMsgEventArgs e){ Console.WriteLine("Faxing mail message:"); Console.WriteLine(" To: : {0\n From: : {1\n Subject: : {2\n Body: {3\n", e.from, e.to, e.subject, e.body); public void Unregister(MailManager mm){ MailManager.MailMsgEventHandler callback = new MailManager.MailMsgEventHandler(FaxMsg FaxMsg); mm.mailmsg -= callback; 15
Példa kódja k Pager osztály class Pager{ public Pager(MailManager mm) { mm.mailmsg += new MailManager.MailMsgEventHandler(PagerMsg PagerMsg); private void PagerMsg(Object Sender, MailManager.MailMsgEventArgs e){ Console.WriteLine(" ("Pager message:"); Console.WriteLine(" To: : {0\n From: : {1\n Subject: : {2\n Body: {3\n", e.from, e.to, e.subject, e.body); public void Unregister(MailManager mm) { MailManager.MailMsgEventHandler callback = new MailManager.MailMsgEventHandler(PagerMsg PagerMsg); mm.mailmsg -= callback; 16
Esemény regisztráci ció feletti közvetlen felügyelet A generált kód k d nem ideális! Ha nincs párhuzamossp rhuzamosság, akkor felesleges a [MethodImplAttribute(MethodImplOpMethodImplOp tions.synchronized)] attribútum, tum, ami lassít! Pláne ha még m loggolni is kell! 17
Példakód d változv ltozása class MailManager { public class MailMsgEventArgs : EventArgs{ public delegate void MailMsgEventHandler(Object sender, MailMsgEventArgs args); private MailMsgEventHandler mailmsgeventhandlerdelegate; public event MailMsgEventHandler MailMsg{ add { mailmsgeventhandlerdelegate = (MailMsgEventHandler( MailMsgEventHandler) Delegate.Combine(mailMsgEventHandlerDelegate mailmsgeventhandlerdelegate,value); remove{ mailmsgeventhandlerdelegate = (MailMsgEventHandler( MailMsgEventHandler) Delegate.Remove(mailMsgEventHandlerDelegate mailmsgeventhandlerdelegate,value); protected virtual void OnMailMsg(MailMsgEventArgs MailMsgEventArgs e) { if (mailmsgeventhandlerdelegate!=null){ mailmsgeventhandlerdelegate(this this,, e); public void SimulateArrivingMsg(String String from,string to,string subject,string body){ ){ 18