Olayları işleme ve tetikleme

.NET'te olaylar temsilci modelini temel alan olaylardır. Temsilci modeli, abonenin sağlayıcıya kaydolmasınave sağlayıcıdan bildirim alamayacak şekilde gözlemci tasarım desenini izler. Olay göndereni bir olayın meydana geldi bildirimini gönderir ve olay alıcısı bu bildirimi alır ve buna bir yanıt tanımlar. Bu makalede temsilci modelinin temel bileşenleri, uygulamalarda olayları nasıl tükettiği ve kodunuzda olayların nasıl uygulanarak uygulanaları açıklanmıştır.

Ekinlikler

Olay, bir eylemin ortaya çıkmasını işaret etmek için nesnesi tarafından gönderilen bir iletidir. Eyleme düğme tıklama gibi kullanıcı etkileşimi neden olabilir veya bir özelliğin değerini değiştirme gibi başka bir program mantığından kaynaklanabilirsiniz. Olayı yükselten nesne, olay göndereni olarak çağrılır. Olay göndereni, hangi nesnenin veya yöntemin neden olduğu olayları alacak (işle) olduğunu bilmiyor. Olay genellikle olay gönderenin bir üyesidir; Örneğin, Click olayı sınıfının bir üyesi ve olayı arabirimi Button PropertyChanged uygulayan sınıfın bir INotifyPropertyChanged üyesidir.

Bir olay tanımlamak için olay sınıfı imzanda C# Visual Basic anahtar sözcüğünü kullanır ve olay için temsilci event Event türünü belirtirsiniz. Temsilciler sonraki bölümde açıklanmıştır.

Genellikle, bir olay yükseltmek için ve protected virtual (C# içinde) veya (C# içinde) olarak Protected işaretlenmiş bir yöntem Overridable eklersiniz (Visual Basic). Bu yönteme On EventName adını girin; örneğin, OnDataReceived . yöntemi, türünde veya türetilen bir nesne olan olay verisi nesnesini belirten EventArgs bir parametre alsa gerekir. Olayı büyütme mantığını geçersiz kılmak için türetilmiş sınıfları etkinleştirmek için bu yöntemi sağlarsınız. Türetilmiş bir sınıf, kayıtlı temsilcilerin olayı almalarını sağlamak için her zaman temel sınıfın On EventName yöntemini çağırması gerekir.

Aşağıdaki örnek, adlı bir olayın nasıl bildir İşley olduğunu ThresholdReached gösterir. Olay, temsilciyle EventHandler ilişkilendirildi ve adlı bir yöntemde OnThresholdReached başlatıldı.

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

Temsilciler

Temsilci, bir yönteme başvuru tutan bir tür. Temsilci, başvuracakları yöntemlerin dönüş türünü ve parametrelerini gösteren bir imza ile birlikte bildirilecektir ve yalnızca imzasıyla eşleşmesi gereken yöntemlere başvurular tutabilir. Bu nedenle temsilci, tür güvenli işlev işaretçisine veya geri çağırmaya eşdeğerdir. Temsilci bildirimi, bir temsilci sınıfı tanımlamak için yeterlidir.

Temsilcilerin .NET'te birçok kullanımı vardır. Olaylar bağlamında temsilci, olay kaynağı ile olayı işen kod arasında bir aracı (veya işaretçiye benzer mekanizma) olur. Bir temsilciyi bir olayla ilişkilendirmek için önceki bölümdeki örnekte gösterildiği gibi olay bildirimine temsilci türünü dahil edin. Temsilciler hakkında daha fazla bilgi için sınıfına Delegate bakın.

.NET, çoğu EventHandler olay EventHandler<TEventArgs> senaryosunu desteklemek için ve temsilcilerini sağlar. Olay EventHandler verilerini içermeen tüm olaylar için temsilciyi kullanın. Olayla EventHandler<TEventArgs> ilgili verileri içeren olaylar için temsilciyi kullanın. Bu temsilcilerin dönüş türü değeri yoktur ve iki parametre alır (olayın kaynağı için bir nesne ve olay verileri için bir nesne).

Temsilciler çok noktayayayındır, yani birden fazla olay işleme yöntemine başvurular tutabilirler. Ayrıntılar için başvuru Delegate sayfasına bakın. Temsilciler, olay işleme konusunda esneklik ve ince denetim sağlar. Temsilci, olay için kayıtlı olay işleyicilerinin listesini koruyarak olayı oluşturan sınıfı için bir olay dağıtıcısı olarak davranır.

ve temsilcilerinin EventHandler EventHandler<TEventArgs> çalışmay olduğu senaryolar için bir temsilci tanımlayabilirsiniz. Bir temsilci tanımlamanız gereken senaryolar çok nadirdir, örneğin, genel tür tanımaz kodla çalışmanız gereken senaryolar. Bir temsilciyi C# ile delegate işaretleyebilirsiniz ve Visual Basic anahtar Delegate sözcüğünü ekleyin. Aşağıdaki örnek, adlı bir temsilcinin nasıl bildir İşley olduğunu ThresholdReachedEventHandler gösterir.

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

Olay verileri

Bir olayla ilişkili veriler bir olay veri sınıfı aracılığıyla sağlanmalıdır. .NET, uygulamalarınız için kullanabileceğiniz birçok olay veri sınıfı sağlar. Örneğin, sınıfı SerialDataReceivedEventArgs olayın olay veri SerialPort.DataReceived sınıfıdır. .NET, tüm olay veri sınıflarını ile sonlandırmak için bir adlandırma desenini EventArgs izler. Olay için temsilciye bakarak bir olayla ilişkili olay veri sınıfını belirlersiniz. Örneğin, SerialDataReceivedEventHandler temsilci SerialDataReceivedEventArgs sınıfını parametrelerinden biri olarak içerir.

sınıfı, EventArgs tüm olay veri sınıfları için temel türdir. EventArgs , aynı zamanda bir olayla ilişkilendirilmiş veriye sahip değilken kullanmakta olduğu sınıftır. Yalnızca diğer sınıflara bir şeyin olduğunu bildirmek için gerekli olan ve herhangi bir veri ile karşılaşması gerektirilen bir olay oluşturduklarında, sınıfını EventArgs temsilciye ikinci parametre olarak dahil etmek. Veri EventArgs.Empty sağlanamıyor olduğunda değeri geçebilirsiniz. Temsilci, EventHandler EventArgs sınıfını parametre olarak içerir.

Özelleştirilmiş bir olay veri sınıfı oluşturmak istediğiniz zaman, 'den türetilen bir sınıf oluşturun ve ardından olayla ilgili verileri geçirirken gereken EventArgs üyeleri sağlar. Genellikle , .NET ile aynı adlandırma desenini kullanlı ve olay veri sınıfı adı ile EventArgs bitsin.

Aşağıdaki örnekte adlı bir olay veri sınıfı ThresholdReachedEventArgs gösterir. Bu, yükseltilen olayına özgü özellikleri içerir.

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

Olay işleyicileri

Bir olayı yanıtlamak için olay alıcıda bir olay işleyicisi yöntemi tanımlarsınız. Bu yöntem, işleyeni olay için temsilcinin imzasıyla eşleşmeli. Olay işleyicisinde, kullanıcı bir düğmeye tıkladığında kullanıcı girişi toplama gibi olay ıldığında gereken eylemleri gerçekleştirebilirsiniz. Olay oluştuğunda bildirim almak için olay işleyicisi yönteminizin etkinliğe abone olması gerekir.

Aşağıdaki örnek, temsilcinin imzasıyla c_ThresholdReached eşleşen adlı bir olay işleyici yöntemini EventHandler gösterir. yöntemi olayına abone ThresholdReached olur.

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

Statik ve dinamik olay işleyicileri

.NET, abonelerin statik veya dinamik olarak olay bildirimlerine kaydolmasına olanak sağlar. Statik olay işleyicileri, olayları işleye sınıfın tüm ömrü boyunca etkindir. Dinamik olay işleyicileri genellikle bazı koşullu program mantığına yanıt olarak program yürütme sırasında açıkça etkinleştirilir ve devre dışı bırakılır. Örneğin, olay bildirimleri yalnızca belirli koşullar altında gerekli olduğunda veya bir uygulama birden çok olay işleyicisi sağlarsa ve çalışma zamanı koşulları kullanılacak uygun olayı tanımlarsa kullanılabilir. Önceki bölümdeki örnekte, bir olay işleyicisini dinamik olarak nasıl ekleyebilirsiniz? Daha fazla bilgi için bkz. Olaylar (Visual Basic) ve Olaylar (C# içinde).

Birden çok olay yükseltme

Sınıfınız birden çok olay üretirse, derleyici olay temsilcisi örneği başına bir alan üretir. Olay sayısı büyükse, temsilci başına bir alanın depolama maliyeti kabul edilebilir olabilir. Bu gibi durumlarda .NET, olay temsilcilerini depolamak için kendi tercihi olan başka bir veri yapısıyla kullanabileceğiniz olay özellikleri sağlar.

Olay özellikleri, olay erişimcilerinin eşlik ettiği olay bildirimlerinden oluşur. Olay erişimcileri, depolama veri yapısından olay temsilcisi örnekleri eklemek veya kaldırmak için tanımladığınız yöntemlerdir. Olay özelliklerinin olay alanlarından daha yavaş olduğunu unutmayın çünkü her olay temsilcisinin çağrılmadan önce bu temsilciyi almak gerekir. Bu, bellek ve hız arasında bir farktır. Sınıfınız sık sık ortaya çıkarılmamış birçok olay tanımladığı için olay özelliklerini uygulamak istemeniz gerekir. Daha fazla bilgi için, bkz. How to: Handle Multiple Events Using Event Properties.

Başlık Açıklama
Nasıl yapılır: Olaylar Oluşturma ve Kullanma Olayları toplama ve tüketmek için örnekler içerir.
Nasıl yapılır: Olay Özelliklerini Kullanarak Birden Çok Olayı İşleme Birden çok olayı işlemek için olay özelliklerini kullanmayı gösterir.
Gözlemci Tasarım Deseni Abonenin sağlayıcıya kaydolmasına ve sağlayıcıdan bildirim alamasına olanak sağlayan tasarım desenini açıklar.

Ayrıca bkz.