Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
.NET'teki olaylar temsilci modelini temel alır. Temsilci modeli, abonenin bir sağlayıcıya kaydolmasını ve sağlayıcıdan bildirim almasını sağlayan gözlemci tasarım deseniniizler. Olay gerçekleştiğinde bir olay göndereni bildirim gönderir. Olay alıcısı yanıtı tanımlar. Bu makale, temsilci modelinin ana bileşenlerini, uygulamalarda olayların nasıl tüketileceğini ve kodunuzda olayların nasıl uygulanacağını açıklamaktadır.
Olay göndereni ile olay tetikleme
Olay, bir nesne tarafından bir eylemin oluştuğuna işaret etmek için gönderilen bir iletidir. Eylem, düğme basılması gibi kullanıcı etkileşimi veya özellik değeri değişikliği gibi başka bir program mantığından kaynaklanıyor olabilir. Olayı oluşturan nesne, olay göndereni olarak adlandırılır. Olay göndereni, tetiklediği olayları alan (işleyen) nesneyi veya yöntemi bilmez. Olay, olay göndericisinin genellikle bir üyesidir. Örneğin, Click olayı Button sınıfının bir üyesidir ve PropertyChanged olayı INotifyPropertyChanged arabirimini uygulayan sınıfın bir üyesidir.
Olay tanımlamak için, olay sınıfınızın imzasında C# olay 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 protected ve virtual (C#'da) veya Protected ve Overridable (Visual Basic'te) olarak işaretlenmiş bir yöntem eklersiniz. yönteminin adlandırma kuralı, On<EventName>gibi OnDataReceivedşeklindedir. Yöntem, EventArgs türünde veya türetilmiş türde bir nesne olarak bir olay veri nesnesini belirten bir parametre almalıdır. Türetilmiş sınıfların olayı tetikleme mantığını geçersiz kılması için bu yöntemi sağlarsınız. Türetilmiş bir sınıf, kayıtlı temsilcilerin olayı aldığından emin olmak için her zaman temel sınıfın On<EventName> yöntemini çağırmalıdır.
Aşağıdaki örnekte, ThresholdReachedadlı bir olayın nasıl bildirildiği gösterilmektedir. Olay, EventHandler temsilcisiyle ilişkilendirilir ve OnThresholdReachedadlı bir yöntemde oluşturulur:
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
Olay işleyicileri için temsilci imzalarını tanımlama
Delege, bir metoda referans tutan bir türdür. Temsilci, başvurulan yöntemlerin dönüş türünü ve parametrelerini gösteren bir imzayla bildirilir. Yalnızca imzasına uyan yöntemlere referansları tutabilir. 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 alanı vardır. Olaylar bağlamında, temsilci olay kaynağı ile olayı işleyen kod arasındaki bir aracıdır (veya işaretçi benzeri bir mekanizmadır). Önceki bölümdeki örnekte gösterildiği gibi, temsilci türünü olay bildirimine ekleyerek bir temsilciyi bir olayla ilişkilendirirsiniz. Temsilciler hakkında daha fazla bilgi için Delegate sınıfına bakın.
.NET, çoğu olay senaryolarını desteklemek için EventHandler ve EventHandler<TEventArgs> temsilcileri sağlar. Olay verilerini içermeyen tüm olaylar için EventHandler temsilcisini kullanın. Olayla ilgili verileri içeren olaylar için EventHandler<TEventArgs> temsilcisini 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ın sınıf nesneleridir; bu da birden fazla olay işleme yöntemine başvuru barındırabilecekleri anlamına gelir. Daha fazla bilgi için Delegate referans sayfasına bakın. 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ı olarak görev yapar.
gerekli temsilciyi tanımlamak için EventHandler ve EventHandler<TEventArgs> temsilci türlerini kullanın. Bir temsilciyi bildirimde delegate türüyle C# ya da Delegate türüyle Visual Basic türünde işaretlersiniz. Aşağıdaki örnekte, ThresholdReachedEventHandleradlı bir temsilcinin nasıl bildirildiği gösterilmektedir.
public delegate void ThresholdReachedEventHandler(object sender, ThresholdReachedEventArgs e);
Public Delegate Sub ThresholdReachedEventHandler(sender As Object, e As ThresholdReachedEventArgs)
Olay veri sınıfları ile çalışma
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, SerialDataReceivedEventArgs sınıfı SerialPort.DataReceived olayının olay veri sınıfıdır. .NET, tüm olay veri sınıflarının EventArgs soneki ile sona erdiği bir adlandırma düzeni izler. Olay için temsilciye bakarak hangi olay veri sınıfının bir olayla ilişkili olduğunu belirlersiniz. Örneğin, SerialDataReceivedEventHandler temsilcisi parametre olarak SerialDataReceivedEventArgs sınıfını içerir.
EventArgs sınıfı genellikle olay veri sınıflarının temel türüdür. Ayrıca, bir olayla ilişkilendirilmiş veri yoksa bu sınıfı da kullanırsınız. Abonelere herhangi bir ek veri olmadan bir şey olduğunu bildiren bir olay oluşturduğunuzda, temsilciye ikinci parametre olarak EventArgs sınıfını ekleyin. Veri sağlanmadığında EventArgs.Empty değerini kullanabilirsiniz. EventHandler temsilcisi parametre olarak EventArgs sınıfını içerir.
Olayla ilgili verileri iletmek için ihtiyaç duyulan üyeleri sağlamak amacıyla EventArgs sınıfından türetilen bir sınıf oluşturabilirsiniz. Genellikle, .NET ile aynı adlandırma desenini kullanmanız ve olay veri sınıfı adınızı EventArgs son eki ile sonlandırmanız gerekir.
Aşağıdaki örnekte, tetiklenen olaya özgü özellikler içeren ThresholdReachedEventArgs adlı bir olay veri sınıfı gösterilmektedir:
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
İşleyicilerle olaylara yanıt verin
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, kullanıcı bir düğmeye bastıktan sonra kullanıcı girişini toplamak gibi olay tetiklendiğinde gerekli eylemleri gerçekleştirirsiniz. Olay gerçekleştiğinde bildirim almak için olay işleyici yönteminizin olaya abone olması gerekir.
Aşağıdaki örnekte, c_ThresholdReached temsilcisinin imzası ile eşleşen EventHandler adlı bir olay işleyici yöntemi gösterilmektedir. Bu yöntem ThresholdReached olayına abonedir.
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
Statik ve dinamik olay işleyicileri kullanma
.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. Yalnızca belirli koşullar altında olay bildirimleri gerektiğinde veya çalışma zamanı koşulları çağrılacak işleyiciyi belirlediğinde dinamik işleyicileri kullanabilirsiniz. Ö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'te) ve Olaylar (C#'de).
Birden çok olayı tetikleme
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 senaryolar için .NET, olay temsilcilerini depolamak için tercih ettiğiniz başka bir veri yapısıyla kullanabileceğiniz olay özellikleri sağlar.
Etkinlik özellikleri, etkinlik bildirimleri ve bu bildirimlere eşlik eden erişimcilerden 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.
Uyarı
Olay özellikleri, her olay temsilcisinin çağrılabilmesi için önce alınması gerektiğinden, olay veri alanlarından daha yavaştır.
Takas bellek ve hız arasında. Sınıfınız seyrek tetiklenen birçok olay tanımlıyorsa, olay özelliklerini uygulamanız gerekir. Daha fazla bilgi için bkz. olay özelliklerini kullanarak birden çok olayı işleme.
İlgili görevleri keşfetme
Aşağıdaki kaynaklar olaylarla çalışmayla ilgili diğer görevleri ve kavramları açıklar:
- Olayları tetiklemek ve işlemek: Olayları tetikleme ve işleme örnekleri bulun.
- Birden çok olayı olay özellikleriyle işleyin: Birden çok olayı işlemek için olay özelliklerinin nasıl kullanılacağını keşfedin.
- gözlemci tasarım deseninikeşfedin: Abonenin sağlayıcıya kaydolmasını ve sağlayıcıdan bildirim almasını sağlayan tasarım desenini gözden geçirin.
Spesifikasyon referansını gözden geçirme
Belirtim başvuru belgeleri, olay işlemeyi destekleyen API'ler için kullanılabilir:
| API adı | API türü | Referans |
|---|---|---|
| EventHandler | Temsilci | EventHandler |
| EventHandler<TEventArgs> | Temsilci | EventHandler<TEventArgs> |
| EventArgs | Sınıf | EventArgs |
| Temsilci | Sınıf | Delegate |