次の方法で共有


方法: カスタム イベントを宣言してブロックを回避する (Visual Basic)

イベント ハンドラーが後続のイベント ハンドラーをブロックしないことが重視される状況があります。 カスタム イベントを使うと、イベントから自身のイベント ハンドラーを非同期に呼び出すことができます。

既定では、イベント宣言のバッキング ストア フィールドは、すべてのイベント ハンドラーが連続的に結合されたマルチキャスト デリゲートです。 つまり、実行の完了に時間がかかるハンドラーがあると、それが完了するまで他のハンドラーはブロックされます。 (実行に時間がかかったり、操作をブロックする可能性があったりするイベント ハンドラーは、設計を見直すことをお勧めします。)

Visual Basic に用意された既定のイベント実装を使う代わりに、カスタム イベントを使うと、イベント ハンドラーを非同期に実行できます。

使用例

次のコード例では、AddHandler アクセサーによって、Click イベントの各ハンドラーのデリゲートが EventHandlerList フィールドに格納されている ArrayList に追加されます。

コードで Click イベントが生成されると、RaiseEvent アクセサーから、BeginInvoke メソッドを使ってすべてのイベント ハンドラー デリゲートが非同期に呼び出されます。 このメソッドは、各ハンドラーをワーカー スレッドに呼び出してから、すぐに制御を返すので、ハンドラーが別のハンドラーをブロックすることはありません。

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

参照

処理手順

方法: カスタム イベントを宣言してメモリを節約する (Visual Basic)

関連項目

ArrayList

BeginInvoke

その他の技術情報

イベント (Visual Basic)