Olayları işleme ve oluşturmaHandle and raising events

.NET 'teki olaylar, temsilci modelini temel alır.Events in .NET are based on the delegate model. Temsilci modeli, bir abonenin ile kaydolmalarını ve sağlayıcıya bildirim almasını sağlayan gözlemci tasarım modeliniizler.The delegate model follows the observer design pattern, which enables a subscriber to register with and receive notifications from a provider. Olay gönderici bir olayın gerçekleştiğini belirten bir bildirim gönderir ve olay alıcısı bu bildirimi alır ve ona bir yanıt tanımlar.An event sender pushes a notification that an event has happened, and an event receiver receives that notification and defines a response to it. Bu makalede temsilci modelinin önemli bileşenleri, uygulamalardaki olayların nasıl kullanılacağı ve kodunuzda olayların nasıl uygulanacağı açıklanmaktadır.This article describes the major components of the delegate model, how to consume events in applications, and how to implement events in your code.

OlaylarEvents

Bir olay, bir eylem oluşumuna işaret etmek için bir nesne tarafından gönderilen iletidir.An event is a message sent by an object to signal the occurrence of an action. Eyleme, düğme tıklamasıyla veya bir özelliğin değerini değiştirme gibi başka bir program mantığının neden olabilir.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. Olayı oluşturan nesneye olay gönderici denir.The object that raises the event is called the event sender. Olay gönderici, hangi nesne veya yöntemin, oluşturduğu olayları alacağını (işleyeceğimizi) bilmez.The event sender doesn't know which object or method will receive (handle) the events it raises. Olay, genellikle olay göndericisinin bir üyesidir; Örneğin, Click olayı sınıfının bir üyesidir Button ve PropertyChanged olay, arabirimi uygulayan sınıfın bir üyesidir INotifyPropertyChanged .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.

Bir olayı tanımlamak için, event Event Event sınıfınızın imzasında C# veya Visual Basic anahtar sözcüğünü kullanırsınız ve olay için temsilci türünü belirtirsiniz.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. Temsilciler sonraki bölümde açıklanmaktadır.Delegates are described in the next section.

Genellikle, bir olayı yükseltmek için protected ve virtual (C# ' de) veya Protected ve Overridable (Visual Basic) olarak işaretlenmiş bir yöntem eklersiniz.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). Bu yöntemin bulunduğu adı On EventName; Örneğin, OnDataReceived .Name this method OnEventName; for example, OnDataReceived. Yöntemi, türünde bir nesne veya türetilmiş bir tür olan bir olay veri nesnesini belirten bir parametre almalıdır EventArgs .The method should take one parameter that specifies an event data object, which is an object of type EventArgs or a derived type. Bu yöntemi, türetilmiş sınıfların olayı oluşturma mantığını geçersiz kılmasını sağlamak için sağlarsınız.You provide this method to enable derived classes to override the logic for raising the event. Türetilmiş bir sınıf, On kayıtlı temsilcilerin olayı aldığından emin olmak için her zaman temel sınıfın EventName metodunu çağırmalıdır.A derived class should always call the OnEventName method of the base class to ensure that registered delegates receive the event.

Aşağıdaki örnek adlı bir olayın nasıl bildirilemeyeceğini gösterir ThresholdReached .The following example shows how to declare an event named ThresholdReached. Olay EventHandler temsilciyle ilişkilendirilir ve adlı bir yöntemde oluşturulur OnThresholdReached .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

TemsilcilerDelegates

Bir temsilci, bir yönteme başvuru tutan bir türdür.A delegate is a type that holds a reference to a method. Bir temsilci, başvurduğu yöntemlere yönelik dönüş türünü ve parametreleri gösteren bir imzayla ve yalnızca kendi imzasıyla eşleşen yöntemlere başvuru tutabilir.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. Bu nedenle bir temsilci, tür kullanımı uyumlu işlev işaretçisine veya geri aramaya eşdeğerdir.A delegate is thus equivalent to a type-safe function pointer or a callback. Temsilci bildirimi, bir temsilci sınıfını tanımlamak için yeterlidir.A delegate declaration is sufficient to define a delegate class.

Temsilcilerin .NET 'te birçok kullanımı vardır.Delegates have many uses in .NET. Olaylar bağlamında, bir temsilci olay kaynağı ve olayı işleyen kod arasında bir ara (veya işaretçi benzeri mekanizmadır).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. Bir temsilciyi, önceki bölümdeki örnekte gösterildiği gibi, olay bildirimine ekleyerek bir olayla ilişkilendirirsiniz.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. Temsilciler hakkında daha fazla bilgi için, Delegate sınıfına bakın.For more information about delegates, see the Delegate class.

.NET, EventHandler EventHandler<TEventArgs> çoğu olay senaryosunu desteklemek için ve temsilcileri sağlar..NET provides the EventHandler and EventHandler<TEventArgs> delegates to support most event scenarios. EventHandlerOlay verileri içermeyen tüm olaylar için temsilciyi kullanın.Use the EventHandler delegate for all events that do not include event data. EventHandler<TEventArgs>Olayla ilgili verileri içeren olaylar için temsilciyi kullanın.Use the EventHandler<TEventArgs> delegate for events that include data about the event. Bu temsilcilerin dönüş türü değeri yoktur ve iki parametre (etkinliğin kaynağı için bir nesne ve olay verileri için bir nesne) alın.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).

Temsilciler çok noktaya yayın, yani birden çok olay işleme yöntemine başvuruları tutabilecekleri anlamına gelir.Delegates are multicast, which means that they can hold references to more than one event-handling method. Ayrıntılar için Delegate başvuru sayfasına bakın.For details, see the Delegate reference page. Temsilciler, olay İşlemede esneklik ve ayrıntılı denetim sağlar.Delegates provide flexibility and fine-grained control in event handling. Bir temsilci, olay için kayıtlı olay işleyicilerinin bir listesini tutarak olayı oluşturan sınıf için bir olay dağıtıcısı işlevi görür.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.

EventHandlerVe EventHandler<TEventArgs> temsilcilerin çalışmalarındaki senaryolarda bir temsilci tanımlayabilirsiniz.For scenarios where the EventHandler and EventHandler<TEventArgs> delegates do not work, you can define a delegate. Bir temsilciyi tanımlamanızı gerektiren senaryolar çok nadir bir durumdur, örneğin, genel türleri tanımayan kodla çalışmanız gerekir.Scenarios that require you to define a delegate are very rare, such as when you must work with code that does not recognize generics. Bir temsilciyi, delegate bildiriminde C# ve Visual Basic Delegate anahtar sözcüğüyle işaretlemelisiniz.You mark a delegate with the C# delegate and Visual Basic Delegate keyword in the declaration. Aşağıdaki örnek adında bir temsilcinin nasıl bildirilemeyeceğini gösterir ThresholdReachedEventHandler .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)

Olay verileriEvent data

Bir olayla ilişkili veriler bir olay veri sınıfı aracılığıyla sağlanalabilir.Data that is associated with an event can be provided through an event data class. .NET, uygulamalarınızda kullanabileceğiniz pek çok olay veri sınıfı sağlar..NET provides many event data classes that you can use in your applications. Örneğin, sınıfı, SerialDataReceivedEventArgs olay için olay veri sınıfıdır SerialPort.DataReceived .For example, the SerialDataReceivedEventArgs class is the event data class for the SerialPort.DataReceived event. .NET, tüm olay veri sınıflarının ile sonundaki bir adlandırma düzeniyle uyar EventArgs ..NET follows a naming pattern of ending all event data classes with EventArgs. Olayın temsilcisine bakarak bir olayla hangi olay verileri sınıfının ilişkilendirildiğini belirlersiniz.You determine which event data class is associated with an event by looking at the delegate for the event. Örneğin, SerialDataReceivedEventHandler temsilci SerialDataReceivedEventArgs sınıfını parametrelerinden biri olarak içerir.For example, the SerialDataReceivedEventHandler delegate includes the SerialDataReceivedEventArgs class as one of its parameters.

EventArgsSınıfı, tüm olay veri sınıflarının temel türüdür.The EventArgs class is the base type for all event data classes. EventArgs Ayrıca, bir olay kendisiyle ilişkilendirilmiş herhangi bir veri içermiyorsa kullandığınız sınıftır.EventArgs is also the class you use when an event does not have any data associated with it. Yalnızca bir şeyin meydana geldiğini ve herhangi bir veri geçmesini gerektirmeyen diğer sınıflara bildirimde bulunan bir olay oluşturduğunuzda, EventArgs temsilciyi temsilciye ikinci parametre olarak ekleyin.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. EventArgs.EmptyVeri sağlanmadıysa değeri geçirebilirsiniz.You can pass the EventArgs.Empty value when no data is provided. EventHandlerTemsilci, EventArgs sınıfını bir parametre olarak içerir.The EventHandler delegate includes the EventArgs class as a parameter.

Özelleştirilmiş bir olay veri sınıfı oluşturmak istediğinizde, öğesinden türetilen bir sınıf oluşturun EventArgs ve ardından olayla ilgili verileri geçirmek için gereken tüm üyeleri sağlayın.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. Genellikle, .NET ile aynı adlandırma modelini kullanmanız ve olay veri sınıfı adınızı ile sonlandırmalısınız EventArgs .Typically, you should use the same naming pattern as .NET and end your event data class name with EventArgs.

Aşağıdaki örnek adlı bir olay veri sınıfını gösterir ThresholdReachedEventArgs .The following example shows an event data class named ThresholdReachedEventArgs. Bu, yükseltilen olaya özgü özellikler içerir.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

Olay işleyicileriEvent handlers

Bir olaya yanıt vermek için, olay alıcısında bir olay işleyicisi yöntemi tanımlarsınız.To respond to an event, you define an event handler method in the event receiver. Bu yöntem, işlemekte olduğunuz olayın temsilcisinin imzasıyla aynı olmalıdır.This method must match the signature of the delegate for the event you are handling. Olay işleyicisinde, Kullanıcı bir düğmeye tıkladıktan sonra Kullanıcı girişi toplama gibi, olay ortaya çıktığında gerekli olan eylemleri gerçekleştirirsiniz.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. Olay gerçekleştiğinde bildirim almak için olay işleyicisi yönteminiz olaya abone olmalıdır.To receive notifications when the event occurs, your event handler method must subscribe to the event.

Aşağıdaki örnek, c_ThresholdReached temsilci için imzayla eşleşen adlı bir olay işleyicisi yöntemini gösterir EventHandler .The following example shows an event handler method named c_ThresholdReached that matches the signature for the EventHandler delegate. Yöntemi olaya abone olur ThresholdReached .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

Statik ve dinamik olay işleyicileriStatic and dynamic event handlers

.NET, abonelerin statik veya dinamik olarak olay bildirimlerine kaydolmanızı sağlar..NET allows subscribers to register for event notifications either statically or dynamically. Statik olay işleyicileri, olaylarını işleyen sınıfın tüm ömrü için geçerli olur.Static event handlers are in effect for the entire life of the class whose events they handle. Dinamik olay işleyicileri, genellikle bazı koşullu program mantığına yanıt olarak program yürütmesi sırasında açıkça etkinleştirilir ve devre dışı bırakılır.Dynamic event handlers are explicitly activated and deactivated during program execution, usually in response to some conditional program logic. Ö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ını kullanmak üzere uygun olanı tanımladıysanız kullanılabilirler.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. Önceki bölümdeki örnek, dinamik olarak bir olay işleyicisinin nasıl ekleneceğini gösterir.The example in the previous section shows how to dynamically add an event handler. Daha fazla bilgi için bkz. Olaylar (Visual Basic) ve olayları (C# ' ta).For more information, see Events (in Visual Basic) and Events (in C#).

Birden çok olayı oluşturmaRaising multiple events

Sınıfınız birden çok olayı harekete geçirirse, derleyici olay temsilcisi örneği başına bir alan oluşturur.If your class raises multiple events, the compiler generates one field per event delegate instance. Olay sayısı büyükse, her temsilci için bir alanın depolama maliyeti kabul edilebilir olmayabilir.If the number of events is large, the storage cost of one field per delegate may not be acceptable. Bu durumlar için, .NET olay temsilcilerini depolamak üzere tercih ettiğiniz başka bir veri yapısıyla kullanabileceğiniz olay özellikleri sağlar.For those situations, .NET provides event properties that you can use with another data structure of your choice to store event delegates.

Olay özellikleri olay erişimcilerine eşlik eden olay bildirimlerinden oluşur.Event properties consist of event declarations accompanied by event accessors. Olay erişimcileri, depolama veri yapısından olay temsilcisi örnekleri eklemek veya kaldırmak için tanımladığınız yöntemlerdir.Event accessors are methods that you define to add or remove event delegate instances from the storage data structure. Olay özelliklerinin, çağrılmadan önce her olay temsilcisinin alınması gerektiğinden olay alanlarından daha yavaş olduğunu unutmayın.Note that event properties are slower than event fields, because each event delegate must be retrieved before it can be invoked. Denge, bellek ve hız arasındadır.The trade-off is between memory and speed. Sınıfınız seyrek olarak yükseltilen çok sayıda olay tanımlıyorsa, olay özelliklerini uygulamak isteyeceksiniz.If your class defines many events that are infrequently raised, you will want to implement event properties. Daha fazla bilgi için bkz. nasıl yapılır: olay özelliklerini kullanarak birden çok olayı işleme.For more information, see How to: Handle Multiple Events Using Event Properties.

BaşlıkTitle AçıklamaDescription
Nasıl yapılır: Olaylar Oluşturma ve KullanmaHow to: Raise and Consume Events Olayları oluşturma ve kullanma örneklerini içerir.Contains examples of raising and consuming events.
Nasıl yapılır: Olay Özelliklerini Kullanarak Birden Çok Olayı İşlemeHow to: Handle Multiple Events Using Event Properties Birden çok olayı işlemek için olay özelliklerinin nasıl kullanılacağını gösterir.Shows how to use event properties to handle multiple events.
Gözlemci tasarım kalıbıObserver Design Pattern Bir abonenin bir sağlayıcıya kaydolmalarını ve bir sağlayıcıdan gelen bildirimleri almasını sağlayan tasarım modelini açıklar.Describes the design pattern that enables a subscriber to register with, and receive notifications from, a provider.

Ayrıca bkz.See also