Olayları işleme ve tetikleme

.NET'teki olaylar temsilci modelini temel alır. Temsilci modeli, abonenin sağlayıcıya kaydolmasını ve sağlayıcıdan bildirim almasını sağlayan gözlemci tasarım desenini izler. Olay göndereni bir olayın gerçekleştiğini belirten bir bildirim gönderir ve olay alıcısı bu bildirimi alır ve buna bir yanıt tanımlar. Bu makalede temsilci modelinin ana bileşenleri, uygulamalarda olayları kullanma ve kodunuzda olayları uygulama açıklanmaktadır.

Ekinlikler

Olay, bir nesne tarafından bir eylemin oluştuğuna işaret etmek için gönderilen bir iletidir. Eyleme düğme tıklaması gibi kullanıcı etkileşimi neden olabilir veya özelliğin değerini değiştirme gibi başka bir program mantığından kaynaklanabilir. Olayı oluşturan nesne, olayı gönderen olarak adlandırılır. Olay göndereni, hangi nesnenin veya yöntemin tetiklediği olayları alacağını (işleyeceğini) bilmiyor. Olay genellikle olay göndereninin bir üyesidir; örneğin, Click olay sınıfının bir üyesidir Button ve PropertyChanged olay arabirimini uygulayan sınıfın INotifyPropertyChanged bir üyesidir.

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

Genellikle, bir olay oluşturmak için ve virtual (C#'da) veya OverridableProtected (Visual Basic içinde) olarak protected işaretlenmiş bir yöntem eklersiniz. Bu yöntemi OnEventName olarak adlandırın; örneğin, OnDataReceived. yöntemi, tür EventArgs veya türetilmiş bir nesne olan bir olay veri nesnesi belirten bir parametre almalıdır. Türetilmiş sınıfların olayı oluşturma mantığını geçersiz kılması için bu yöntemi sağlarsınız. Türetilmiş bir sınıf, kayıtlı temsilcilerin On olayı aldığından emin olmak için her zaman temel sınıfın EventName yöntemini çağırmalıdır.

Aşağıdaki örnekte adlı ThresholdReachedbir olayın nasıl bildir olduğu gösterilmektedir. Olay temsilciyle EventHandler ilişkilendirilir ve adlı OnThresholdReachedbir yöntemde oluşturulur.

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ürdür. Temsilci, başvurduğunu yöntemlerin dönüş türünü ve parametrelerini gösteren bir imzayla bildirilir ve yalnızca kendi imzası ile eşleşen yöntemlere başvuruları tutabilir. Bu nedenle temsilci, tür açısından güvenli işlev işaretçisine veya geri çağırmaya eşdeğerdir. Temsilci bildirimi, 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şleyen kod arasında bir aracıdır (veya işaretçi benzeri bir mekanizmadır). Önceki bölümdeki örnekte gösterildiği gibi, olay bildirimine temsilci türünü ekleyerek bir temsilciyi bir olayla ilişkilendirirsiniz. Temsilciler hakkında daha fazla bilgi için sınıfına Delegate bakın.

.NET, olay senaryolarının EventHandler çoğunu desteklemek için ve EventHandler<TEventArgs> temsilcilerini sağlar. Olay verilerini içermeyen tüm olaylar için temsilciyi EventHandler kullanın. EventHandler<TEventArgs> Olayla 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 noktaya yayındır; başka bir deyişle birden fazla olay işleme yöntemine başvurular tutabilirler. Ayrıntılar için başvuru sayfasına bakın Delegate . Temsilciler, olay işlemede esneklik ve ayrıntılı denetim sağlar. Temsilci, olay için kayıtlı olay işleyicilerinin listesini tutarak olayı tetikleyen sınıf için olay dağıtıcısı görevi görür.

ve EventHandler<TEventArgs> temsilcilerinin EventHandler çalışmadığı senaryolar için bir temsilci tanımlayabilirsiniz. Temsilci tanımlamanızı gerektiren senaryolar, örneğin genel türleri tanımayan kodla çalışmanız gerektiği durumlar gibi çok nadirdir. Temsilciyi bildirimde C# delegate ve Visual Basic Delegate anahtar sözcüğüyle işaretlersiniz. Aşağıdaki örnekte adlı ThresholdReachedEventHandlerbir temsilcinin nasıl bildir olduğu gösterilmektedir.

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ğlanabilir. .NET, uygulamalarınızda kullanabileceğiniz birçok olay veri sınıfı sağlar. Örneğin sınıfı, SerialDataReceivedEventArgs olayın olay veri sınıfıdır SerialPort.DataReceived . .NET, ile tüm olay veri sınıflarını EventArgssonlandırmak için bir adlandırma deseni izler. Olayın temsilcisine bakarak bir olayla ilişkili olay veri sınıfını belirlersiniz. Örneğin, SerialDataReceivedEventHandler temsilci sınıfını SerialDataReceivedEventArgs parametrelerinden biri olarak içerir.

EventArgs sınıfı, tüm olay veri sınıfları için temel türdür. EventArgs , bir olayla ilişkilendirilmiş veri olmadığında da kullandığınız sınıftır. Yalnızca diğer sınıflara bir şey olduğunu bildirmek ve herhangi bir veri geçirmesi gerekmeyen bir olay oluşturduğunuzda, sınıfını temsilciye ikinci parametre olarak ekleyin EventArgs . Veri sağlanmayan EventArgs.Empty değeri geçirebilirsiniz. Temsilci EventHandler sınıfını EventArgs parametre olarak içerir.

Özelleştirilmiş bir olay veri sınıfı oluşturmak istediğinizde, öğesinden EventArgstüretilen bir sınıf oluşturun ve ardından olayla ilgili verileri geçirmek için gereken tüm üyeleri sağlayın. Genellikle, .NET ile aynı adlandırma desenini kullanmanız ve olay veri sınıfı adınızı ile EventArgssonlandırmanız gerekir.

Aşağıdaki örnekte adlı ThresholdReachedEventArgsbir olay veri sınıfı gösterilmektedir. Tetiklenen olaya özgü özellikler 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 olaya yanıt vermek için olay alıcısında bir olay işleyicisi yöntemi tanımlarsınız. Bu yöntem, işlemekte olduğunuz olay için temsilcinin imzası ile eşleşmelidir. Olay işleyicisinde, olay tetiklendiğinde gerekli olan eylemleri gerçekleştirirsiniz. Örneğin, kullanıcı bir düğmeye tıkladıktan sonra kullanıcı girişini toplarsınız. Olay gerçekleştiğinde bildirim almak için olay işleyici yönteminizin olaya abone olması gerekir.

Aşağıdaki örnekte, temsilcinin imzası ile eşleşen adlı c_ThresholdReached bir olay işleyici yöntemi gösterilmektedir EventHandler . yöntemi olaya abonedir ThresholdReached .

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 olay bildirimlerine statik veya dinamik olarak kaydolmasına olanak tanır. Statik olay işleyicileri, olaylarını işledikleri 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 gerekliyse veya bir uygulama birden çok olay işleyicisi sağlıyorsa ve çalışma zamanı koşulları kullanılacak uygun olanı tanımlıyorsa kullanılabilir. Önceki bölümdeki örnekte, bir olay işleyicisinin dinamik olarak nasıl ekleneceği gösterilmektedir. Daha fazla bilgi için bkz. Olaylar (Visual Basic)ve Olaylar (C#'da).

Birden çok olay oluşturma

Sınıfınız birden çok olay oluşturursa, derleyici olay temsilcisi örneği başına bir alan oluşturur. Olay sayısı büyükse, temsilci başına bir alanın depolama maliyeti kabul edilebilir olmayabilir. Bu gibi durumlarda.NET, olay temsilcilerini depolamak için tercih ettiğiniz 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. Her olay temsilcisinin çağrılabilmesi için alınması gerektiğinden olay özelliklerinin olay alanlarından daha yavaş olduğunu unutmayın. Bu denge bellek ve hız arasında. Sınıfınız seyrek tetiklenen birçok olay tanımlıyorsa, olay özelliklerini uygulamak istersiniz. Daha fazla bilgi için bkz . Nasıl yapılır: Olay Özelliklerini Kullanarak Birden Çok Olayı İşleme.

Başlık Açıklama
Nasıl yapılır: Olaylar Oluşturma ve Kullanma Olayları oluşturma ve kullanma örnekleri içerir.
Nasıl yapılır: Olay Özelliklerini Kullanarak Birden Çok Olayı İşleme Birden çok olayı işlemek için olay özelliklerinin nasıl kullanılacağını gösterir.
Gözlemci Tasarım Deseni Abonenin bir sağlayıcıya kaydolmasını ve sağlayıcıdan bildirim almasını sağlayan tasarım desenini açıklar.

Ayrıca bkz.