C# Events

Mit C# Events kannst du Klassen zu einem bestimmten Zeitpunkt über ein Geschehen in deiner Anwendung benachrichtigen und Daten übersenden.

Löst eine Klasse ein Event aus, dann ist die Klasse der Publisher. Empfängt eine Klasse ein Event, dann ist die Klasse ein Subscriber. Du kannst mehrere Subscriber erstellen, die alle auf das Auftreten eines Events warten. Wenn beispielsweise ein Publisher ein Event auslöst, registrieren sich die Subscriber bei diesem Event, um die Benachrichtigung zu verarbeiten. Du kannst ein Event abonnieren, in dem du einem Event einen Eventhandler hinzufügst.

Mit C# Events kannst du Objekten die Möglichkeit bieten, leichter miteinander zu kommunizieren und asynchrone Vorgänge zu behandeln. Ein Event ist ein spezieller Delegate. Mit einem Delegat kannst du die Signatur eines Eventhandler-Method definieren. Du registrierst also die Subscriber-Klasse für die Ereignishandler-Methode beim Delegaten, und der Delegate benachrichtigt dann die Subscriber-Klasse, wenn das Ereignis eintritt.

So kannst du ein Event erstellen und ausführen (invoking):

public delegate void ProcessCompleted();  // Delegate Methode erstellen
                    
public class ProgramLogic
{
    public event ProcessCompleted CompletedEvent; // Event erstellen und an delegate binden

    public void Start()
    {
        Console.WriteLine("Started!");

        // Funktionaler Code hier

        Console.WriteLine("Done!");

        // Überprüfen ob es Subscriber gibt und dann das Event ausführen
        CompletedEvent?.Invoke();
    }


}

Hinweis: Mit CompletedEvent? überprüfen wir, ob es Listener für dieses Event gibt. Führst du ein Event (Invoke) ohne Listener aus, kommt es zu einer Exception.

C# Event Subscriber / Listener hinzufügen

class Program
{
    public static void Main()
    {
        ProgramLogic logic = new ProgramLogic();

        logic.CompletedEvent += logic.OnCompleted; // Eventhandler hinzufügen

        logic.StartProcess();
    }

    // Event handler (Methode wird ausgeführt wenn Event invoked wird)
    public static void OnCompleted()
    {
        Console.WriteLine("Process Completed!");
    }
}

Die Program-Klasse abonniert das ProcessCompleted-Ereignis und registriert sich mit dem += Operator bei diesem. Auf die gleiche Weise fügen wir der Aufrufliste eines Multicastdelegers Methoden hinzu. Die OnCompleted() Methode behandelt das Ereignis, da es mit der Signatur des ProcessCompleted Delegaten übereinstimmt.

Integrierter EventHandler

.NET Framework enthält vordefinierte Delegattypen für die gängigsten Ereignisse, z. B. EventHandler. In der Regel sollte jedes Ereignis zwei Parameter enthalten: die Quelle des Events und die Daten des Events. Wenn das Event keine Daten enthält, die an Handler gesendet werden sollen, verwende den EventHandler Delegaten. Wenn das Event Daten enthält, verwende den EventHandler<TEventArgs> Delegaten.

Im obigen Beispiel kann der EventHandler Delegat verwendet werden, ohne einen benutzerdefinierten ProcessCompleted Delegaten zu deklarieren, wie unten gezeigt:

class Program
{
    public static void Main()
    {
        ProgramLogic logic = new ProgramLogic();

        logic.CompletedEvent += logic.OnCompleted; // Eventhandler hinzufügen

        logic.StartProcess();
    }

    // Event handler mit passender Signatur (Parameter)
    public static void OnCompleted(object sender, EventArgs e)
    {
        Console.WriteLine("Process Completed!");
    }
}

public class ProgramLogic 
{
    // Built-in .NET EventHandler
    public event EventHandler ProcessCompleted; 

    public void StartProcess()
    {
        Console.WriteLine("Started!");
        // Funktionaler Code hier
        Console.WriteLine("Done");

        // Sender und Daten werde übergeben
        ProcessCompleted?.Invoke(this, EventArgs.Empty);
    }   
}

C# Events Daten übergeben

Die meisten Events senden einige Daten an die Subscribers. Die EventArgs-Klasse ist die Basisklasse für alle Events-Datenklassen. .NET enthält viele integrierte Events-Datenklassen doch du kannst auch eine eigene benutzerdefinierte Klasse für deine Event-Daten erstellen. Dafür leitest du deine Klasse einfach von der EventArgs Klasse ab.

Hier kannst du noch mehr über C# Events erfahren oder lies dir hier unseren Beitrag zum Thema SQL Datenbanken und C# durch.