Gebeurtenissen verwerken en genereren

Gebeurtenissen in .NET zijn gebaseerd op het gemachtigde model. Het gemachtigde model volgt het ontwerppatroon van de waarnemer, waarmee een abonnee zich kan registreren bij en meldingen van een provider kan ontvangen. Een afzender van een gebeurtenis pusht een melding dat er een gebeurtenis is gebeurd en een gebeurtenisontvanger ontvangt die melding en definieert een reactie hierop. In dit artikel worden de belangrijkste onderdelen van het gemachtigde model beschreven, hoe u gebeurtenissen in toepassingen gebruikt en hoe u gebeurtenissen in uw code implementeert.

gebeurtenis

Een gebeurtenis is een bericht dat door een object wordt verzonden om het optreden van een actie aan te geven. De actie kan worden veroorzaakt door gebruikersinteractie, zoals klikken op een knop, of kan het gevolg zijn van een andere programmalogica, zoals het wijzigen van de waarde van een eigenschap. Het object dat de gebeurtenis genereert, wordt de afzender van de gebeurtenis genoemd. De afzender van de gebeurtenis weet niet welk object of welke methode wordt ontvangen (handle) de gebeurtenissen die het genereert. De gebeurtenis is doorgaans lid van de afzender van de gebeurtenis; De Click gebeurtenis is bijvoorbeeld lid van de Button klasse en de PropertyChanged gebeurtenis is lid van de klasse waarmee de INotifyPropertyChanged interface wordt geïmplementeerd.

Als u een gebeurtenis wilt definiëren, gebruikt u C# event of het Visual Basic Event trefwoord in de handtekening van uw gebeurtenisklasse en geeft u het type gemachtigde voor de gebeurtenis op. Gemachtigden worden beschreven in de volgende sectie.

Als u een gebeurtenis wilt genereren, voegt u meestal een methode toe die is gemarkeerd als protected en virtual (in C#) of ProtectedOverridable (in Visual Basic). Noem deze methode OnEventName, OnDataReceivedbijvoorbeeld . Voor de methode moet één parameter worden gebruikt die een gebeurtenisgegevensobject opgeeft. Dit is een object van het type EventArgs of een afgeleid type. U geeft deze methode op om afgeleide klassen in staat te stellen de logica voor het genereren van de gebeurtenis te overschrijven. Een afgeleide klasse moet altijd de OnEventName-methode van de basisklasse aanroepen om ervoor te zorgen dat geregistreerde gemachtigden de gebeurtenis ontvangen.

In het volgende voorbeeld ziet u hoe u een gebeurtenis met de naam ThresholdReacheddeclareert. De gebeurtenis is gekoppeld aan de gemachtigde en gegenereerd in een methode met de EventHandler naam 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

Gedelegeerden

Een gemachtigde is een type dat een verwijzing naar een methode bevat. Een gemachtigde wordt gedeclareerd met een handtekening met het retourtype en de parameters voor de methoden waarnaar deze verwijst, en kan verwijzingen alleen bevatten naar methoden die overeenkomen met de handtekening. Een gemachtigde is dus gelijk aan een type-veilige functieaanwijzer of een callback. Een gedelegeerdedeclaratie is voldoende om een gemachtigde klasse te definiëren.

Gemachtigden hebben veel toepassingen in .NET. In de context van gebeurtenissen is een gemachtigde een tussenliggend (of pointer-achtig mechanisme) tussen de gebeurtenisbron en de code die de gebeurtenis verwerkt. U koppelt een gemachtigde aan een gebeurtenis door het gedelegeerdetype op te neemt in de gebeurtenisdeclaratie, zoals wordt weergegeven in het voorbeeld in de vorige sectie. Zie de Delegate klasse voor meer informatie over gemachtigden.

.NET biedt de en EventHandler<TEventArgs> gedelegeerden ter ondersteuning van de EventHandler meeste gebeurtenisscenario's. Gebruik de EventHandler gemachtigde voor alle gebeurtenissen die geen gebeurtenisgegevens bevatten. Gebruik de EventHandler<TEventArgs> gemachtigde voor gebeurtenissen die gegevens over de gebeurtenis bevatten. Deze gemachtigden hebben geen retourtypewaarde en nemen twee parameters (een object voor de bron van de gebeurtenis en een object voor gebeurtenisgegevens).

Gemachtigden zijn multicast, wat betekent dat ze verwijzingen naar meer dan één methode voor gebeurtenisafhandeling kunnen bevatten. Zie de Delegate referentiepagina voor meer informatie. Gemachtigden bieden flexibiliteit en fijnmazige controle bij het verwerken van gebeurtenissen. Een gedelegeerde fungeert als een gebeurtenis-dispatcher voor de klasse die de gebeurtenis genereert door een lijst met geregistreerde gebeurtenis-handlers voor de gebeurtenis te onderhouden.

Voor scenario's waarin de EventHandler en EventHandler<TEventArgs> gedelegeerden niet werken, kunt u een gemachtigde definiëren. Scenario's waarvoor u een gemachtigde moet definiëren, zijn zeer zeldzaam, bijvoorbeeld wanneer u moet werken met code die geen generieken herkent. U markeert een gemachtigde met de C# delegate en Visual Basic Delegate trefwoord in de declaratie. In het volgende voorbeeld ziet u hoe u een gedelegeerde met de naam ThresholdReachedEventHandlerdeclareert.

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

Gebeurtenisgegevens

Gegevens die aan een gebeurtenis zijn gekoppeld, kunnen worden opgegeven via een gebeurtenisgegevensklasse. .NET biedt veel gebeurtenisgegevensklassen die u in uw toepassingen kunt gebruiken. De SerialDataReceivedEventArgs klasse is bijvoorbeeld de gebeurtenisgegevensklasse voor de SerialPort.DataReceived gebeurtenis. .NET volgt een naamgevingspatroon voor het beëindigen van alle gebeurtenisgegevensklassen met EventArgs. U bepaalt welke gebeurtenisgegevensklasse is gekoppeld aan een gebeurtenis door naar de gemachtigde voor de gebeurtenis te kijken. De gemachtigde bevat bijvoorbeeld SerialDataReceivedEventHandler de SerialDataReceivedEventArgs klasse als een van de parameters.

De EventArgs klasse is het basistype voor alle gebeurtenisgegevensklassen. EventArgs is ook de klasse die u gebruikt wanneer aan een gebeurtenis geen gegevens zijn gekoppeld. Wanneer u een gebeurtenis maakt die alleen bedoeld is om andere klassen te waarschuwen dat er iets is gebeurd en geen gegevens hoeft door te geven, neemt u de EventArgs klasse op als de tweede parameter in de gemachtigde. U kunt de EventArgs.Empty waarde doorgeven wanneer er geen gegevens worden opgegeven. De EventHandler gemachtigde bevat de EventArgs klasse als parameter.

Wanneer u een aangepaste gebeurtenisgegevensklasse wilt maken, maakt u een klasse die is afgeleid van EventArgsen geeft u vervolgens leden op die nodig zijn om gegevens door te geven die betrekking hebben op de gebeurtenis. Normaal gesproken moet u hetzelfde naamgevingspatroon gebruiken als .NET en de naam van de gebeurtenisgegevensklasse beëindigen met EventArgs.

In het volgende voorbeeld ziet u een gebeurtenisgegevensklasse met de naam ThresholdReachedEventArgs. Het bevat eigenschappen die specifiek zijn voor de gebeurtenis die wordt gegenereerd.

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

Event Handlers

Als u wilt reageren op een gebeurtenis, definieert u een gebeurtenis-handlermethode in de gebeurtenisontvanger. Deze methode moet overeenkomen met de handtekening van de gemachtigde voor de gebeurtenis die u verwerkt. In de gebeurtenis-handler voert u de acties uit die vereist zijn wanneer de gebeurtenis wordt gegenereerd, zoals het verzamelen van gebruikersinvoer nadat de gebruiker op een knop heeft geklikt. Als u meldingen wilt ontvangen wanneer de gebeurtenis plaatsvindt, moet uw gebeurtenishandlermethode zich abonneren op de gebeurtenis.

In het volgende voorbeeld ziet u een gebeurtenishandlermethode met de naam c_ThresholdReached die overeenkomt met de handtekening voor de EventHandler gemachtigde. De methode abonneert zich op de ThresholdReached gebeurtenis.

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 en dynamische gebeurtenis-handlers

Met .NET kunnen abonnees zich registreren voor gebeurtenismeldingen, zowel statisch als dynamisch. Statische gebeurtenis-handlers zijn van kracht voor de hele levensduur van de klasse waarvan ze de gebeurtenissen verwerken. Dynamische gebeurtenis-handlers worden expliciet geactiveerd en gedeactiveerd tijdens het uitvoeren van het programma, meestal in reactie op bepaalde logica voor voorwaardelijke programma's. Ze kunnen bijvoorbeeld worden gebruikt als gebeurtenismeldingen alleen onder bepaalde voorwaarden nodig zijn of als een toepassing meerdere gebeurtenis-handlers biedt en runtimevoorwaarden de juiste definiëren die moeten worden gebruikt. In het voorbeeld in de vorige sectie ziet u hoe u dynamisch een gebeurtenis-handler toevoegt. Zie Gebeurtenissen (in Visual Basic) en Gebeurtenissen (in C#) voor meer informatie.

Meerdere gebeurtenissen genereren

Als uw klasse meerdere gebeurtenissen genereert, genereert de compiler één veld per instantie van de gemachtigde gebeurtenis. Als het aantal gebeurtenissen groot is, zijn de opslagkosten van één veld per gemachtigde mogelijk niet acceptabel. In dergelijke situaties biedt .NET gebeurteniseigenschappen die u kunt gebruiken met een andere gegevensstructuur van uw keuze om gebeurtenisdelegeerden op te slaan.

Gebeurteniseigenschappen bestaan uit gebeurtenisdeclaraties vergezeld van gebeurtenistoegangsors. Gebeurtenistoegangsors zijn methoden die u definieert om instanties van gebeurtenisdelegenten toe te voegen of te verwijderen uit de opslaggegevensstructuur. Houd er rekening mee dat gebeurteniseigenschappen langzamer zijn dan gebeurtenisvelden, omdat elke gebeurtenisdelegent moet worden opgehaald voordat deze kan worden aangeroepen. De afweging is tussen geheugen en snelheid. Als uw klasse veel gebeurtenissen definieert die niet vaak worden gegenereerd, wilt u gebeurteniseigenschappen implementeren. Zie Procedure voor meer informatie : Meerdere gebeurtenissen afhandelen met behulp van gebeurteniseigenschappen.

Titel Beschrijving
Procedure: Gebeurtenissen genereren en gebruiken Bevat voorbeelden van het genereren en gebruiken van gebeurtenissen.
Procedure: Meerdere gebeurtenissen afhandelen met behulp van gebeurteniseigenschappen Laat zien hoe u gebeurteniseigenschappen gebruikt om meerdere gebeurtenissen af te handelen.
Ontwerppatroon waarnemer Beschrijft het ontwerppatroon waarmee een abonnee zich kan registreren bij en meldingen van een provider kan ontvangen.

Zie ook