다음을 통해 공유


방법: 차단을 방지하는 사용자 지정 이벤트 선언(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

참고 항목