Behandeln und Auslösen von EreignissenHandling and raising events

Ereignisse in .NET basieren auf dem Delegatmodell.Events in .NET are based on the delegate model. Das Delegatmodell folgt dem Beobachterentwurfsmuster, mit dem sich ein Abonnent bei einem Anbieter registrieren und Benachrichtigungen von diesem empfangen kann.The delegate model follows the observer design pattern, which enables a subscriber to register with and receive notifications from a provider. Von einem Ereignissender wird eine Benachrichtigung erstellt, die angibt, dass ein Ereignis aufgetreten ist. Diese Benachrichtigung wird dann vom Ereignisempfänger empfangen, und eine Antwort wird definiert.An event sender pushes a notification that an event has happened, and an event receiver receives that notification and defines a response to it. In diesem Artikel werden die Hauptkomponenten des Delegatmodells, das Verwenden von Ereignissen in Anwendungen und das Implementieren von Ereignissen im Code beschrieben.This article describes the major components of the delegate model, how to consume events in applications, and how to implement events in your code.

Informationen zur Ereignisbehandlung bei Windows 8.x Store-Apps finden Sie unter Events and routed events overview (Übersicht über Ereignisse und Routingereignisse).For information about handling events in Windows 8.x Store apps, see Events and routed events overview.

EreignisseEvents

Ein Ereignis ist eine Meldung, die von einem Objekt gesendet wird, um das Auftreten einer Aktion zu signalisieren.An event is a message sent by an object to signal the occurrence of an action. Die Aktion kann durch Benutzerinteraktionen wie das Klicken auf eine Schaltfläche verursacht werden, oder sie kann durch eine andere Programmlogik, z.B. das Ändern eines Eigenschaftswerts, ausgelöst werden.The action can be caused by user interaction, such as a button click, or it can result from some other program logic, such as changing a property’s value. Das Objekt, von dem das Ereignis ausgelöst wird, wird als Ereignissender bezeichnet.The object that raises the event is called the event sender. Dem Ereignissender ist nicht bekannt, welches Objekt oder welche Methode die ausgelösten Ereignisse empfangen (behandeln) wird.The event sender doesn't know which object or method will receive (handle) the events it raises. Das Ereignis ist in der Regel ein Member des Ereignissenders. Beispielsweise ist das Click-Ereignis ein Member der Klasse Button, und das PropertyChanged-Ereignis ist ein Member der Klasse, von der die INotifyPropertyChanged-Schnittstelle implementiert wird.The event is typically a member of the event sender; for example, the Click event is a member of the Button class, and the PropertyChanged event is a member of the class that implements the INotifyPropertyChanged interface.

Zum Definieren eines Ereignisses verwenden Sie entweder das Schlüsselwort event (in C#) oder das Schlüsselwort Event (in Visual Basic) in der Signatur der Ereignisklasse und geben den Typ des Delegaten für das Ereignis an.To define an event, you use the C# event or the Visual Basic Event keyword in the signature of your event class, and specify the type of delegate for the event. Delegaten werden im nächsten Abschnitt erläutert.Delegates are described in the next section.

In der Regel fügen Sie zum Auslösen eines Ereignisses eine Methode hinzu, die als protected und virtual (in C#) bzw. Protected und Overridable (in Visual Basic) gekennzeichnet ist.Typically, to raise an event, you add a method that is marked as protected and virtual (in C#) or Protected and Overridable (in Visual Basic). Nennen Sie diese Methode OnEventName (zum Beispiel OnDataReceived).Name this method OnEventName; for example, OnDataReceived. Von dieser Methode muss ein Parameter akzeptiert werden, der ein Ereignisdatenobjekt angibt, welches ein Objekt des Typs EventArgs oder eines abgeleiteten Typs ist.The method should take one parameter that specifies an event data object, which is an object of type EventArgs or a derived type. Sie stellen diese Methode bereit, damit abgeleitete Klassen die Logik zum Auslösen des Ereignisses überschreiben können.You provide this method to enable derived classes to override the logic for raising the event. Eine abgeleitete Klasse sollte immer die OnEventName-Methode der Basisklasse aufrufen, um sicherzustellen, dass registrierte Delegaten das Ereignis empfangen.A derived class should always call the OnEventName method of the base class to ensure that registered delegates receive the event.

Im folgenden Beispiel wird die Deklaration eines Ereignisses namens ThresholdReachederläutert.The following example shows how to declare an event named ThresholdReached. Das Ereignis wird dem EventHandler-Delegaten zugeordnet, und es wird in einer Methode namens OnThresholdReached ausgelöst.The event is associated with the EventHandler delegate and raised in a method named OnThresholdReached.

class Counter
{
    public event EventHandler ThresholdReached;

    protected virtual void OnThresholdReached(EventArgs e)
    {
        EventHandler handler = ThresholdReached;
        handler?.Invoke(this, e);
    }

    // provide remaining implementation for the class
}
Public Class Counter
    Public Event ThresholdReached As EventHandler

    Protected Overridable Sub OnThresholdReached(e As EventArgs)
        RaiseEvent ThresholdReached(Me, e)
    End Sub

    ' provide remaining implementation for the class
End Class

DelegatenDelegates

Ein Delegat ist ein Typ, der einen Verweis auf eine Methode enthält.A delegate is a type that holds a reference to a method. Ein Delegat wird mit einer Signatur deklariert, die den Rückgabetyp und die Parameter für die Methoden angibt, auf die er verweist. Er kann nur Verweise auf Methoden enthalten, die mit der Signatur übereinstimmen.A delegate is declared with a signature that shows the return type and parameters for the methods it references, and it can hold references only to methods that match its signature. Ein Delegat entspricht insofern einem typsicheren Funktionszeiger oder einem Rückruf.A delegate is thus equivalent to a type-safe function pointer or a callback. Mit einer Delegatdeklaration ist eine Delegatklasse ausreichend definiert.A delegate declaration is sufficient to define a delegate class.

Delegaten können in .NET vielfältig verwendet werden.Delegates have many uses in .NET. Im Kontext der Ereignisse ist ein Delegat ein Mittler (oder ein zeigerähnlicher Mechanismus) zwischen der Ereignisquelle und dem Code, mit dem das Ereignis behandelt wird.In the context of events, a delegate is an intermediary (or pointer-like mechanism) between the event source and the code that handles the event. Sie weisen einen Delegaten einem Ereignis zu, indem Sie den Delegattyp in der Ereignisdeklaration, wie im Beispiel des vorherigen Abschnitts veranschaulicht, einschließen.You associate a delegate with an event by including the delegate type in the event declaration, as shown in the example in the previous section. Weitere Informationen zu Delegaten finden Sie unter der Delegate-Klasse.For more information about delegates, see the Delegate class.

.NET stellt die Delegaten EventHandler und EventHandler<TEventArgs> zur Unterstützung der meisten Ereignisszenarien bereit..NET provides the EventHandler and EventHandler<TEventArgs> delegates to support most event scenarios. Verwenden Sie den EventHandler-Delegaten für alle Ereignisse, in denen keine Ereignisdaten enthalten sind.Use the EventHandler delegate for all events that do not include event data. Verwenden Sie den EventHandler<TEventArgs>-Delegaten für Ereignisse, die Daten über das Ereignis enthalten.Use the EventHandler<TEventArgs> delegate for events that include data about the event. Diese Delegaten verfügen über keinen Rückgabetypwert und akzeptieren zwei Parameter (ein Objekt für die Ereignisquelle sowie ein Objekt für Ereignisdaten).These delegates have no return type value and take two parameters (an object for the source of the event, and an object for event data).

Delegaten sind Multicastdelegaten, d.h., sie können Verweise auf mehrere Methoden für die Ereignisbehandlung enthalten.Delegates are multicast, which means that they can hold references to more than one event-handling method. Weitere Informationen finden Sie auf der Delegate-Referenzseite.For details, see the Delegate reference page. Delegaten bieten Flexibilität und eine genaue Steuerung bei der Ereignisbehandlung.Delegates provide flexibility and fine-grained control in event handling. Ein Delegat fungiert als ein Ereignisverteiler für die Klasse, die das Ereignis auslöst, indem er eine Liste der registrierten Ereignishandler für das Ereignis verwaltet.A delegate acts as an event dispatcher for the class that raises the event by maintaining a list of registered event handlers for the event.

Für Szenarien, in denen die Delegaten EventHandler und EventHandler<TEventArgs> nicht funktionieren, können Sie einen Delegaten definieren.For scenarios where the EventHandler and EventHandler<TEventArgs> delegates do not work, you can define a delegate. Szenarien, für die Sie einen Delegaten definieren müssen, sind sehr selten, z. B. bei der Arbeit mit Code, von dem keine Generics erkannt werden.Scenarios that require you to define a delegate are very rare, such as when you must work with code that does not recognize generics. Markieren Sie einen Delegaten mit dem Schlüsselwort delegate (in C#) und dem Schlüsselwort Delegate (in Visual Basic) in der Deklaration.You mark a delegate with the C# delegate and Visual Basic Delegate keyword in the declaration. Im folgenden Beispiel wird die Deklaration eines Delegaten namens ThresholdReachedEventHandler erläutert.The following example shows how to declare a delegate named ThresholdReachedEventHandler.

public delegate void ThresholdReachedEventHandler(object sender, ThresholdReachedEventArgs e);
Public Delegate Sub ThresholdReachedEventHandler(sender As Object, e As ThresholdReachedEventArgs)

EreignisdatenEvent data

Daten, die einem Ereignis zugewiesen sind, können durch eine Ereignisdatenklasse bereitgestellt werden.Data that is associated with an event can be provided through an event data class. In .NET werden viele Ereignisdatenklassen für die Verwendung in Ihren Anwendungen bereitgestellt..NET provides many event data classes that you can use in your applications. Zum Beispiel ist die SerialDataReceivedEventArgs-Klasse die Ereignisdatenklasse für das SerialPort.DataReceived-Ereignis.For example, the SerialDataReceivedEventArgs class is the event data class for the SerialPort.DataReceived event. .NET folgt einem Benennungsmuster, bei dem alle Ereignisdatenklassen auf EventArgs enden..NET follows a naming pattern of ending all event data classes with EventArgs. Sie bestimmen, welche Ereignisdatenklasse einem Ereignis zugeordnet wird, indem Sie den Delegaten nach dem Ereignis durchsuchen.You determine which event data class is associated with an event by looking at the delegate for the event. Zum Beispiel enthält der SerialDataReceivedEventHandler-Delegat die SerialDataReceivedEventArgs-Klasse als einen seiner Parameter.For example, the SerialDataReceivedEventHandler delegate includes the SerialDataReceivedEventArgs class as one of its parameters.

Die EventArgs-Klasse ist der Basistyp aller Ereignisdatenklassen.The EventArgs class is the base type for all event data classes. EventArgs ist auch die Klasse, die bei einem Ereignis verwendet wird, dem keine Daten zugeordnet sind.EventArgs is also the class you use when an event does not have any data associated with it. Wenn Sie ein Ereignis erstellen, nur um andere Klassen über ein Geschehnis zu benachrichtigen, ohne dass Daten übergeben werden, schließen Sie die EventArgs-Klasse als zweiten Parameter im Delegaten ein.When you create an event that is only meant to notify other classes that something happened and does not need to pass any data, include the EventArgs class as the second parameter in the delegate. Sie können den EventArgs.Empty-Wert übergeben, wenn keine Daten bereitgestellt werden.You can pass the EventArgs.Empty value when no data is provided. Im EventHandler-Delegat ist die EventArgs-Klasse als Parameter enthalten.The EventHandler delegate includes the EventArgs class as a parameter.

Wenn Sie eine benutzerdefinierte Ereignisdatenklasse erstellen möchten, erstellen Sie eine von EventArgs abgeleitete Klasse, und stellen Sie dann alle Member bereit, die zum Übergeben der mit dem Ereignis verknüpften Daten erforderlich sind.When you want to create a customized event data class, create a class that derives from EventArgs, and then provide any members needed to pass data that is related to the event. In der Regel sollten Sie dem Benennungsmuster von .NET folgen und den Ereignisdaten-Klassennamen auf EventArgs enden lassen.Typically, you should use the same naming pattern as .NET and end your event data class name with EventArgs.

Im folgenden Beispiel wird eine Ereignisdatenklasse ThresholdReachedEventArgs veranschaulicht.The following example shows an event data class named ThresholdReachedEventArgs. Darin sind Eigenschaften enthalten, die für das ausgelöste Ereignis spezifisch sind.It contains properties that are specific to the event being raised.

public class ThresholdReachedEventArgs : EventArgs
{
    public int Threshold { get; set; }
    public DateTime TimeReached { get; set; }
}
Public Class ThresholdReachedEventArgs
    Inherits EventArgs

    Public Property Threshold As Integer
    Public Property TimeReached As DateTime
End Class

EreignishandlerEvent handlers

Um auf ein Ereignis zu reagieren, definieren Sie eine Ereignishandlermethode im Ereignisempfänger.To respond to an event, you define an event handler method in the event receiver. Diese Methode muss der Signatur des Delegaten für das von Ihnen behandelte Ereignis entsprechen.This method must match the signature of the delegate for the event you are handling. Im Ereignishandler führen Sie die Aktionen aus, die beim Auslösen des Ereignisses erforderlich sind, zum Beispiel das Sammeln von Benutzereingaben, nachdem der Benutzer auf eine Schaltfläche geklickt hat.In the event handler, you perform the actions that are required when the event is raised, such as collecting user input after the user clicks a button. Um bei Auftreten des Ereignisses Benachrichtigungen zu empfangen, muss die Ereignishandlermethode das Ereignis abonnieren.To receive notifications when the event occurs, your event handler method must subscribe to the event.

Im folgenden Beispiel wird die Ereignishandlermethode c_ThresholdReached dargestellt, die der Signatur für den EventHandler-Delegaten entspricht.The following example shows an event handler method named c_ThresholdReached that matches the signature for the EventHandler delegate. Die Methode abonniert das ThresholdReached-Ereignis.The method subscribes to the ThresholdReached event.

class Program
{
    static void Main()
    {
        var c = new Counter();
        c.ThresholdReached += c_ThresholdReached;

        // provide remaining implementation for the class
    }

    static void c_ThresholdReached(object sender, EventArgs e)
    {
        Console.WriteLine("The threshold was reached.");
    }
}
Module Module1

    Sub Main()
        Dim c As New Counter()
        AddHandler c.ThresholdReached, AddressOf c_ThresholdReached

        ' provide remaining implementation for the class
    End Sub

    Sub c_ThresholdReached(sender As Object, e As EventArgs)
        Console.WriteLine("The threshold was reached.")
    End Sub
End Module

Statische und dynamische EreignishandlerStatic and dynamic event handlers

Mit .NET können sich Abonnenten entweder statisch oder dynamisch für Ereignisbenachrichtigungen registrieren..NET allows subscribers to register for event notifications either statically or dynamically. Statische Ereignishandler sind für die gesamte Lebensdauer der Klasse gültig, deren Ereignisse sie behandeln.Static event handlers are in effect for the entire life of the class whose events they handle. Dynamische Ereignishandler werden bei der Programmausführung explizit aktiviert und deaktiviert. Dies erfolgt in der Regel als Reaktion auf eine bedingte Programmlogik.Dynamic event handlers are explicitly activated and deactivated during program execution, usually in response to some conditional program logic. So können sie beispielsweise verwendet werden, wenn Ereignisbenachrichtigungen nur unter bestimmten Bedingungen erforderlich sind, oder wenn eine Anwendung mehrere Ereignishandler bereitstellt und über die Laufzeitbedingungen definiert wird, welcher davon verwendet wird.For example, they can be used if event notifications are needed only under certain conditions or if an application provides multiple event handlers and run-time conditions define the appropriate one to use. Im Beispiel des vorherigen Abschnitts wird das dynamische Hinzufügen eines Ereignishandlers veranschaulicht.The example in the previous section shows how to dynamically add an event handler. Weitere Informationen finden Sie unter Ereignisse (Visual Basic) und Ereignisse (C#-Programmierhandbuch).For more information, see Events (in Visual Basic) and Events (in C#).

Auslösen mehrerer EreignisseRaising multiple events

Wenn von der Klasse mehrere Ereignisse ausgelöst werden, generiert der Compiler ein Feld pro Ereignisdelegatinstanz.If your class raises multiple events, the compiler generates one field per event delegate instance. Ist die Anzahl der Ereignisse sehr hoch, wird u. U. zu viel Speicher beansprucht, wenn für jeden Delegaten ein Feld generiert wird.If the number of events is large, the storage cost of one field per delegate may not be acceptable. Für solche Situationen werden in .NET Ereigniseigenschaften bereitgestellt, die Sie mit einer weiteren beliebig wählbaren Datenstruktur zum Speichern von Ereignisdelegaten verwenden können.For those situations, .NET provides event properties that you can use with another data structure of your choice to store event delegates.

Ereigniseigenschaften bestehen aus Ereignisdeklarationen, die von Ereignisaccessoren begleitet werden.Event properties consist of event declarations accompanied by event accessors. Ereignisaccessoren sind die von Ihnen definierten Methoden, mit denen Ereignisdelegatinstanzen der Speicherdatenstruktur hinzugefügt oder daraus entfernt werden können.Event accessors are methods that you define to add or remove event delegate instances from the storage data structure. Beachten Sie, dass Ereigniseigenschaften langsamer als Ereignisfelder sind, da jeder Ereignisdelegat abgerufen werden muss, bevor er aufgerufen werden kann.Note that event properties are slower than event fields, because each event delegate must be retrieved before it can be invoked. Sie müssen daher einen Kompromiss zwischen hoher Speicherauslastung und verminderter Geschwindigkeit finden.The trade-off is between memory and speed. Wenn die Klasse viele Ereignisse definiert, die selten ausgelöst werden, können Sie Ereigniseigenschaften implementieren.If your class defines many events that are infrequently raised, you will want to implement event properties. Weitere Informationen finden Sie unter Vorgehensweise: Behandeln mehrerer Ereignisse mit Ereigniseigenschaften.For more information, see How to: Handle Multiple Events Using Event Properties.

TitelTitle BESCHREIBUNGDescription
Vorgehensweise: Auslösen und Behandeln von EreignissenHow to: Raise and Consume Events In diesem Abschnitt sind Beispiele zum Auslösen und Verarbeiten von Ereignissen enthalten.Contains examples of raising and consuming events.
Vorgehensweise: Behandeln mehrerer Ereignisse mit EreigniseigenschaftenHow to: Handle Multiple Events Using Event Properties In diesem Abschnitt wird die Verwendung von Ereigniseigenschaften zum Behandeln mehrerer Ereignisse veranschaulicht.Shows how to use event properties to handle multiple events.
BeobachterentwurfsmusterObserver Design Pattern Das Entwurfsmuster, mit dem sich ein Abonnent bei einem Anbieter registrieren und Benachrichtigungen von diesem empfangen kann, wird beschrieben.Describes the design pattern that enables a subscriber to register with, and receive notifications from, a provider.
Vorgehensweise: Verarbeiten von Ereignissen in einer Web Forms-AnwendungHow to: Consume Events in a Web Forms Application In diesem Abschnitt wird das Behandeln eines Ereignisses, das von einem Web Forms-Steuerelement ausgelöst wird, veranschaulicht.Shows how to handle an event that is raised by a Web Forms control.

Siehe auchSee also