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

Ada beberapa keadaan ketika satu penanganan aktivitas seharusnya tidak memblokir penanganan aktivitas berikutnya. Peristiwa kustom memungkinkan peristiwa untuk memanggil penanganan aktivitasnya secara asinkron.

Secara default, bidang backing-store untuk deklarasi peristiwa adalah delegasi multicast yang menggabungkan semua penanganan aktivitas secara serial. Ini berarti bahwa jika satu penanganan membutuhkan waktu lama untuk diselesaikan, penanganan lain akan diblokir hingga penanganan tersebut selesai. (Penanganan aktivitas yang berperilaku baik tidak boleh melakukan operasi yang panjang 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 penanganan peristiwa Click ke ArrayList yang disimpan di bidang EventHandlerList.

Saat kode memunculkan peristiwa Click, aksesor RaiseEvent memanggil semua penanganan aktivitas yang mendelegasikan secara asinkron menggunakan metode BeginInvoke. Metode tersebut memanggil setiap penanganan pada utas pekerja dan segera kembali, sehingga penanganan 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