Bagikan melalui


Cara: Mendeklarasikan Peristiwa Kustom Untuk Menghindari Pemblokiran (Visual Basic)

Ada beberapa keadaan ketika penting agar satu penanganan peristiwa tidak memblokir penanganan peristiwa berikutnya. Acara kustom memungkinkan acara memanggil pengendali acaranya secara asinkron.

Secara default, bidang penyimpanan cadangan untuk deklarasi peristiwa adalah delegasi multicast yang secara serial menggabungkan semua penanganan aktivitas. Ini berarti bahwa jika satu handler membutuhkan waktu lama untuk diselesaikan, itu memblokir handler lain sampai selesai. (Penangan kejadian yang berperilaku baik tidak boleh melakukan operasi yang lama atau berpotensi memblokir.)

Alih-alih menggunakan implementasi default peristiwa yang disediakan Visual Basic, Anda dapat menggunakan peristiwa kustom untuk menjalankan penanganan aktivitas secara asinkron.

Contoh

Dalam contoh ini, aksesor AddHandler menambahkan delegasi untuk setiap handler peristiwa Click ke ArrayList yang disimpan dalam bidang EventHandlerList.

Saat kode memicu peristiwa Click, aksesor RaiseEvent memanggil semua delegasi handler peristiwa secara asinkron menggunakan metode BeginInvoke. Metode itu memanggil setiap handler pada utas pekerja dan segera kembali, sehingga handler tidak dapat memblokir satu sama lain.

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

Lihat juga