Megosztás a következőn keresztül:


Események kezelése és emelése

A .NET-események a delegált modellen alapulnak. A delegált modell a megfigyelői tervezési mintát követi, amely lehetővé teszi az előfizető számára, hogy regisztráljon és értesítéseket kapjon egy szolgáltatótól. Az esemény feladója egy esemény bekövetkezésekor küld értesítést. Az esemény fogadója határozza meg a választ. Ez a cikk a delegált modell fő összetevőit, az alkalmazások eseményeinek használatát és az események kódban való implementálását ismerteti.

Események létrehozása eseményküldővel

Az esemény egy objektum által küldött üzenet, amely egy művelet előfordulását jelzi. Előfordulhat, hogy a művelet felhasználói beavatkozás, például gombnyomás, vagy más programlogika, például tulajdonságérték-változás eredménye. Az eseményt felhozó objektum neve esemény feladója. Az esemény feladója nem ismeri azt az objektumot vagy metódust, amely fogadja (kezeli) az általa kiváltott eseményeket. Az esemény általában az esemény feladójának tagja. Az esemény például Click az Button osztály tagja, az PropertyChanged esemény pedig annak az osztálynak a tagja, amely megvalósítja a INotifyPropertyChanged felületet.

Esemény definiálásához használja a C# eseményt vagy a Visual Basic Esemény kulcsszót az eseményosztály aláírásában, és adja meg az esemény delegáltjának típusát. A meghatalmazottakról a következő szakaszban olvashat.

Általában egy esemény létrehozásához olyan metódust kell hozzáadnia, amely C#-ban protected, virtual vagy Visual Basicben Protected, Overridable van megjelölve. Az elnevezési konvenció a metódusra On<EventName>, például OnDataReceived. A metódusnak egy olyan paramétert kell használnia, amely egy eseményadat-objektumot határoz meg, amely egy típusú EventArgs vagy származtatott típusú objektum. Ezzel a módszerrel engedélyezheti, hogy a származtatott osztályok felülbírálhassák az esemény növelésének logikáját. A származtatott osztálynak mindig meg kell hívnia az On<EventName> alaposztály metódusát, hogy a regisztrált delegáltak megkapják az eseményt.

Az alábbi példa bemutatja, miként deklarálhat egy eseményt ThresholdReached. Az esemény a EventHandler delegálthoz van társítva, és egy OnThresholdReached nevű metódusban meghívásra kerül.

class Counter
{
    public event EventHandler ThresholdReached;

    protected virtual void OnThresholdReached(EventArgs e)
    {
        ThresholdReached?.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

Delegált aláírások deklarálása eseménykezelőkhöz

A meghatalmazott olyan típus, amely egy metódusra mutató hivatkozást tartalmaz. A deklarált meghatalmazott aláírással rendelkezik, amely a hivatkozott metódusok visszatérési típusát és paramétereit jeleníti meg. Csak az aláírásának megfelelő metódusokra mutató hivatkozásokat tartalmazhat. A delegált egyenértékű egy típusbiztos függvénymutatóval vagy visszahívással. A delegálási deklaráció elegendő a delegált osztály meghatározásához.

A meghatalmazottaknak sok felhasználási módja van a .NET-ben. Az események kontextusában a meghatalmazott egy közvetítő (vagy mutatószerű mechanizmus) az eseményforrás és az eseményt kezelő kód között. Egy delegáltat úgy társíthat egy eseményhez, hogy az eseménydeklarációban szerepel a delegált típusa, ahogy az előző szakaszban látható példában is látható. További információért a delegátusokról tekintse meg a Delegate osztályt.

A .NET a legtöbb eseményforgatókönyv támogatásához biztosítja a EventHandler és EventHandler<TEventArgs> delegáltakat. Használja a EventHandler delegáltat minden olyan eseményhez, amely nem tartalmaz eseményadatokat. Használja a EventHandler<TEventArgs> delegáltat olyan eseményekhez, amelyek az esemény adatait tartalmazzák. Ezek a meghatalmazottak nem rendelkeznek visszatérési típusú értékkel, és két paramétert használnak (az esemény forrásának objektumát és egy objektumot az eseményadatokhoz).

A delegate-ek multicast osztályobjektumok, ami azt jelenti, hogy több eseménykezelő módszerre is hivatkozhatnak. További információt a referenciaoldalon Delegate talál. A meghatalmazottak rugalmasságot és részletes vezérlést biztosítanak az eseménykezelésben. A meghatalmazott eseményközvetítőként működik az eseményt indító osztály számára az esemény regisztrált eseménykezelőinek listájának fenntartásával.

Használja a EventHandler és EventHandler<TEventArgs> delegátumtípusokat a szükséges delegátum meghatározásához. Jelöljön meg egy meghatalmazottat a delegateC# vagy a DelegateVisual Basic típusával a deklarációban. Az alábbi példa bemutatja, hogyan deklarálhat egy meghatalmazottat:ThresholdReachedEventHandler

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

Eseményadatosztályok használata

Az eseményhez társított adatok egy esemény adatosztályon keresztül adhatók meg. A .NET számos eseményadatosztályt biztosít, amelyeket az alkalmazásokban használhat. Például a(z) SerialDataReceivedEventArgs osztály az SerialPort.DataReceived esemény adat-osztálya. A .NET egy elnevezési mintát követ, amelyben az összes eseményadatosztály az EventArgs utótaggal végződik. Az eseményhez tartozó esemény adatosztályának meghatározásához tekintse meg az esemény delegáltját. Például a SerialDataReceivedEventHandler delegált paraméterként tartalmazza az SerialDataReceivedEventArgs osztályt.

Az EventArgs osztály általában az eseményadatosztályok alaptípusa. Ezt az osztályt akkor is használhatja, ha egy eseményhez nincs adat társítva. Amikor olyan eseményt hoz létre, amely értesíti az előfizetőket arról, hogy további adatok nélkül történt valami, a delegált második paramétereként adja meg az EventArgs osztályt. Átadhatja a EventArgs.Empty értéket, ha nincs megadva adat. A EventHandler meghatalmazott paraméterként tartalmazza az EventArgs osztályt.

Létrehozhat egy osztályt, amely az EventArgs osztályból származik, hogy az eseményhez kapcsolódó adatok átadásához szükséges tagokat biztosítsa. Általában ugyanazt az elnevezési mintát kell használnia, mint a .NET, és az eseményadat osztály nevének a végén az EventArgs utótagot használja.

Az alábbi példa egy eseményadatosztályt mutat be, ThresholdReachedEventArgs amely az eseményre jellemző tulajdonságokat tartalmazza:

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

Reagálás az eseményekre kezelőkkel

Az eseményre való reagáláshoz meg kell határoznia egy eseménykezelő metódust az esemény fogadójában. Ennek a metódusnak meg kell egyeznie a kezelt esemény meghatalmazottjának aláírásával. Az eseménykezelőben végrehajtja az esemény létrehozásakor szükséges műveleteket, például a felhasználói bemenetek gyűjtését, miután a felhasználó megnyom egy gombot. Ha értesítéseket szeretne kapni az esemény bekövetkezésekor, az eseménykezelő metódusnak elő kell fizetnie az eseményre.

Az alábbi példa egy olyan eseménykezelő metódust mutat be c_ThresholdReached , amely megfelel a meghatalmazott aláírásának EventHandler . A metódus feliratkozik az eseményre ThresholdReached :

class ProgramTwo
{
    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

Statikus és dinamikus eseménykezelők használata

A .NET lehetővé teszi az előfizetők számára, hogy statikusan vagy dinamikusan regisztráljanak az eseményértesítésekre. A statikus eseménykezelők annak az osztálynak az egész életére érvényesek, amelynek eseményeit kezelik. A dinamikus eseménykezelők explicit módon aktiválódnak és inaktiválódnak a program végrehajtása során, általában valamilyen feltételes programlogikára reagálva. Dinamikus kezelőket akkor használhat, ha az eseményértesítésekre csak bizonyos feltételek mellett van szükség, vagy ha a futásidejű feltételek határozzák meg a meghívandó kezelőt. Az előző szakaszban látható példa bemutatja, hogyan adhat hozzá dinamikusan eseménykezelőt. További információ: Események (a Visual Basicben) és események (C#-ban).

Több esemény indítása

Ha az osztály több eseményt hoz létre, a fordító eseménymeghatalmazási példányonként egy mezőt hoz létre. Ha az események száma nagy, előfordulhat, hogy a meghatalmazottonkénti egy mező tárolási költsége nem elfogadható. Ezekben a forgatókönyvekben a .NET olyan eseménytulajdonságokat biztosít, amelyeket egy másik, ön által választott adatstruktúrával használhat az eseménymeghatalmazók tárolásához.

Az eseménytulajdonságok eseménydeklarációkból állnak, amelyekhez eseménykiegészítők tartoznak. Az eseménykiegészítők olyan metódusok, amelyekkel eseménymeghatalmazási példányokat adhat hozzá vagy távolíthat el a tárolási adatstruktúrából.

Megjegyzés

Az eseménytulajdonságok lassabbak az eseménymezőknél, mert minden eseménydelegáltat le kell kérni, mielőtt azt meghívnánk.

A kompromisszum a memória és a sebesség között van. Ha az osztály számos eseményt határoz meg, amelyek ritkán kerülnek meghívásra, implementálnia kell az eseménytulajdonságokat. További információ: Több esemény kezelése eseménytulajdonságok használatával.

Az alábbi források az események kezelésével kapcsolatos egyéb feladatokat és fogalmakat ismertetik:

Specifikációra vonatkozó referencia áttekintése

A specifikáció referenciadokumentációja az eseménykezelést támogató API-khoz érhető el:

API név API típusa Referenciák
EventHandler Képviselő EventHandler
EventHandler<TEventArgs> Képviselő EventHandler<TEventArgs>
EventArgs Osztály EventArgs
Képviselő Osztály Delegate