Aracılığıyla paylaş


Nasıl yapılır: Engellemeyi Önlemek için Özel Olaylar Bildirme (Visual Basic)

Bir olay işleyicinin sonraki olay işleyicilerini engellememesi önemli olduğunda birkaç durum vardır. Özel olaylar, olayın zaman uyumsuz olarak olay işleyicilerini çağırmasına olanak sağlar.

Varsayılan olarak, bir olay bildiriminin yedekleme deposu alanı, tüm olay işleyicilerini ardışık olarak birleştiren çok noktaya yayın temsilcisidir. Başka bir deyişle, bir işleyicinin tamamlanması uzun sürerse, tamamlanana kadar diğer işleyicileri engeller. (İyi davranan olay işleyicileri hiçbir zaman uzun veya engelleyici işlemler gerçekleştirmemelidir.)

Visual Basic'in sağladığı olayların varsayılan uygulamasını kullanmak yerine, olay işleyicilerini zaman uyumsuz olarak yürütmek için özel bir olay kullanabilirsiniz.

Örnek

Bu örnekte erişimci, AddHandler olayının her işleyicisi için temsilciyi Click alanında depolanan bir ArrayList öğeye ekler.

Kod Click olayını yükselttiğinde, RaiseEvent erişimcisi BeginInvoke yöntemini kullanarak tüm olay işleyici temsilcilerini zaman uyumsuz olarak çağırır. Bu yöntem, bir çalışan iş parçacığındaki her işleyiciyi çağırır ve hemen geri döner; bu nedenle işleyiciler birbirini engelleyemez.

Public NotInheritable Class ReliabilityOptimizedControl
    'Defines a list for storing the delegates
    Private EventHandlerList As New ArrayList

    'Defines the Click event using the custom event syntax.
    'The RaiseEvent always invokes the delegates asynchronously
    Public Custom Event Click As EventHandler
        AddHandler(ByVal value As EventHandler)
            EventHandlerList.Add(value)
        End AddHandler
        RemoveHandler(ByVal value As EventHandler)
            EventHandlerList.Remove(value)
        End RemoveHandler
        RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
            For Each handler As EventHandler In EventHandlerList
                If handler IsNot Nothing Then
                    handler.BeginInvoke(sender, e, Nothing, Nothing)
                End If
            Next
        End RaiseEvent
    End Event
End Class

Ayrıca bakınız