Aracılığıyla paylaş


Güncelleştirilmiş .NET Core Olay Düzeni

Geri

Ö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.EventArgstü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 EventArgstü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 EventArgstü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.EventArgstüretilir. Geriye dönük uyumluluk, 'den türetmeye devam etmelerinin önemli nedenlerinden System.EventArgsbiridir. 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.

Zaman uyumsuz abonelerle olaylar

Öğ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 asyncyü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.

İleri