Güncelleştirilmiş .NET Core Olay Düzeni
Önceki makalede en yaygın olay desenleri ele alınmıştı. .NET Core daha rahat bir desene sahiptir. Bu sürümdeEventHandler<TEventArgs>
, tanımın artık öğesinden System.EventArgs
türetilmiş bir sınıf olması gereken kısıtlaması TEventArgs
yoktur.
Bu, sizin için esnekliği artırır ve geriye dönük olarak uyumludur. Şimdi esneklikle başlayalım. System.EventArgs sınıfı, nesnenin sığ bir kopyasını oluşturan bir yöntem tanıtır: MemberwiseClone()
.
Bu yöntemin, öğesinden EventArgs
türetilen herhangi bir sınıf için işlevselliğini uygulamak için yansıma kullanması gerekir. Bu işlevin belirli bir türetilmiş sınıfta oluşturulması daha kolaydır. Bu, System.EventArgs'ten türetmenin tasarımlarınızı sınırlayan ancak ek bir fayda sağlamayan bir kısıtlama olduğu anlamına gelir.
Aslında, ve SearchDirectoryArgs
tanımlarınıFileFoundArgs
, 'den EventArgs
türetilmeyecek şekilde değiştirebilirsiniz.
Program tam olarak aynı şekilde çalışır.
Ayrıca, bir değişiklik daha yaparsanız öğesini bir yapı olarak da değiştirebilirsiniz SearchDirectoryArgs
:
internal struct SearchDirectoryArgs
{
internal string CurrentSearchDirectory { get; }
internal int TotalDirs { get; }
internal int CompletedDirs { get; }
internal SearchDirectoryArgs(string dir, int totalDirs, int completedDirs) : this()
{
CurrentSearchDirectory = dir;
TotalDirs = totalDirs;
CompletedDirs = completedDirs;
}
}
Ek değişiklik, tüm alanları başlatan oluşturucuyu girmeden önce parametresiz oluşturucuyu çağırmaktır. Bu ekleme olmadan, C# kuralları özelliklere atanmadan önce erişildiğini bildirir.
sınıfını FileFoundArgs
(başvuru türü) yapısına (değer türü) değiştirmemelisiniz. Bunun nedeni iptali işleme protokollerinin olay bağımsız değişkenlerinin başvuruyla geçirilmesini gerektirmesidir. Aynı değişikliği yaptıysanız, dosya arama sınıfı hiçbir olay abonesi tarafından yapılan değişiklikleri asla gözlemlemez. Her abone için yapının yeni bir kopyası kullanılır ve bu kopya, dosya arama nesnesi tarafından görülen kopyadan farklı bir kopya olur.
Şimdi bu değişikliğin geriye dönük olarak nasıl uyumlu olabileceğini düşünelim.
Kısıtlamanın kaldırılması mevcut kodu etkilemez. Var olan tüm olay bağımsız değişken türleri yine 'den System.EventArgs
türetilir.
Geriye dönük uyumluluk, 'den türetmeye devam etmelerinin önemli nedenlerinden System.EventArgs
biridir. Mevcut olay aboneleri, klasik desene uyan bir olayın abonesi olur.
Benzer mantıkla, şimdi oluşturulan herhangi bir olay bağımsız değişken türünün mevcut kod temellerinde abonesi olmaz. türetilmeyen System.EventArgs
yeni olay türleri bu kod temellerini bozmaz.
Öğrenmeniz gereken son bir desen vardır: Zaman uyumsuz kodu çağıran olay abonelerini doğru yazma. Zorluk, async ve await makalesinde açıklanmıştır. Zaman uyumsuz yöntemlerin geçersiz bir dönüş türü olabilir, ancak bu kesinlikle önerilmez. Olay abone kodunuz zaman uyumsuz bir yöntemi çağırdığında, yöntem async void
oluşturmaktan başka seçeneğiniz yoktur. Olay işleyici imzası bunu gerektirir.
Bu karşıt rehberliği uzlaştırmanız gerekiyor. Bir şekilde, güvenli async void
bir yöntem oluşturmanız gerekir. Uygulamanız gereken desenin temelleri aşağıdadır:
worker.StartWorking += async (sender, eventArgs) =>
{
try
{
await DoWorkAsync();
}
catch (Exception e)
{
//Some form of logging.
Console.WriteLine($"Async task failure: {e.ToString()}");
// Consider gracefully, and quickly exiting.
}
};
İlk olarak, işleyicinin zaman uyumsuz işleyici olarak işaretlendiğini fark edin. Bir olay işleyicisi temsilci türüne atandığı için geçersiz bir dönüş türüne sahip olur. Bu, işleyicide gösterilen deseni izlemeniz ve zaman uyumsuz işleyici bağlamından herhangi bir özel durumun atmasına izin vermediğiniz anlamına gelir. Bir görev döndürmediğinden, hata durumunu girerek hatayı bildirebilecek bir görev yoktur. yöntemi zaman uyumsuz olduğundan, yöntem yalnızca özel durum oluşturamaz. (Çağıran yöntem olduğu için async
yürütmeye devam etti.) Gerçek çalışma zamanı davranışı farklı ortamlar için farklı şekilde tanımlanır. İş parçacığını veya iş parçacığının sahibi olan işlemi sonlandırabilir veya işlemi belirsiz bir durumda bırakabilir. Bu olası sonuçların tümü son derece istenmeyen sonuçlardır.
Bu nedenle, zaman uyumsuz Görev için await deyimini kendi deneme bloğunuzda sarmalamanız gerekir. Hatalı bir göreve neden olursa, hatayı günlüğe kaydedebilirsiniz. Bu, uygulamanızın kurtaramadığı bir hataysa, programdan hızlı ve düzgün bir şekilde çıkabilirsiniz
Bunlar .NET olay düzeninde yapılan önemli güncelleştirmelerdir. Çalıştığınız kitaplıklarda önceki sürümlerin birçok örneğini görürsünüz. Ancak en son desenlerin ne olduğunu da anlamanız gerekir.
Bu serideki bir sonraki makale, tasarımlarınızda ve events
kullanımı delegates
arasında ayrım yapmak için size yardımcı olur. Bunlar benzer kavramlardır ve bu makale programlarınız için en iyi kararı vermenizi sağlayacaktır.
.NET geri bildirimi
.NET, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin: