In diesem Modell haben Sie Publisher, die eine gewisse Logik und veröffentlichen tun "Ereignis".
Publisher verschicken ihre Veranstaltung nur an Abonnenten, die sich für den Erhalt der spezifischen Veranstaltung angemeldet haben.
In C# kann jedes Objekt eine Reihe von Ereignissen veröffentlichen, die von anderen Anwendungen abonniert werden können.
Wenn die Veröffentlichungsklasse ein Ereignis auslöst, werden alle abonnierten Anwendungen benachrichtigt.
Die folgende Abbildung zeigt diesen Mechanismus.

einfachstes Beispiel möglich, auf Ereignisse und Delegaten in C#:
Code ist selbsterklärend, auch habe ich die Kommentare hinzugefügt, um den Code zu löschen.
using System;
public class Publisher //main publisher class which will invoke methods of all subscriber classes
{
public delegate void TickHandler(Publisher m, EventArgs e); //declaring a delegate
public TickHandler Tick; //creating an object of delegate
public EventArgs e = null; //set 2nd paramter empty
public void Start() //starting point of thread
{
while (true)
{
System.Threading.Thread.Sleep(300);
if (Tick != null) //check if delegate object points to any listener classes method
{
Tick(this, e); //if it points i.e. not null then invoke that method!
}
}
}
}
public class Subscriber1 //1st subscriber class
{
public void Subscribe(Publisher m) //get the object of pubisher class
{
m.Tick += HeardIt; //attach listener class method to publisher class delegate object
}
private void HeardIt(Publisher m, EventArgs e) //subscriber class method
{
System.Console.WriteLine("Heard It by Listener");
}
}
public class Subscriber2 //2nd subscriber class
{
public void Subscribe2(Publisher m) //get the object of pubisher class
{
m.Tick += HeardIt; //attach listener class method to publisher class delegate object
}
private void HeardIt(Publisher m, EventArgs e) //subscriber class method
{
System.Console.WriteLine("Heard It by Listener2");
}
}
class Test
{
static void Main()
{
Publisher m = new Publisher(); //create an object of publisher class which will later be passed on subscriber classes
Subscriber1 l = new Subscriber1(); //create object of 1st subscriber class
Subscriber2 l2 = new Subscriber2(); //create object of 2nd subscriber class
l.Subscribe(m); //we pass object of publisher class to access delegate of publisher class
l2.Subscribe2(m); //we pass object of publisher class to access delegate of publisher class
m.Start(); //starting point of publisher class
}
}
Ausgang:
Gehört ihm durch Listener
Es wird von Listener2 Heard
Es wird von Zuhörer gehört
Gehört ihm durch Listener2
Es gehört von Hör mal zu er . . . (unendliche Zeiten)
Um ein paar Zeilen zu sparen und den Null-Check zu vermeiden, initialisieren Sie Ihre Veranstaltung wie folgt: http://stackoverflow.com/questions/340610/create-empty-c-event-handlers-automatically/ 340618 # 340618 – Dinah
@Dinah: Das vermeidet den Null-Check nicht. Sie können später noch 'SomethingHappened = null' setzen (eine praktische, wenn auch faule und nicht ideale Möglichkeit, alle Handler abzumelden), so dass die Nullprüfung immer notwendig ist. –
@DanPuzey: Sie können innerhalb der Klasse, aber ebenso können Sie sicherstellen, dass Sie * nicht tun * - und * anderen * Code kann es nicht tun, da es nur abonnieren und abmelden kann. Wenn Sie sicherstellen, dass Sie ihn nie innerhalb Ihrer Klasse auf null setzen, ist es in Ordnung, die Nullprüfung zu vermeiden. –