방법: 차단을 방지하는 사용자 지정 이벤트 선언(Visual Basic)How to: Declare Custom Events To Avoid Blocking (Visual Basic)

한 이벤트 처리기가 후속 이벤트 처리기를 차단 하지 않는 것이 중요 한 여러 가지 상황이 있습니다.There are several circumstances when it is important that one event handler not block subsequent event handlers. 사용자 지정 이벤트를 사용 하면 이벤트에서 이벤트 처리기를 비동기적으로 호출할 수 있습니다.Custom events allow the event to call its event handlers asynchronously.

기본적으로 이벤트 선언의 백업 저장소 필드는 모든 이벤트 처리기를 순차적으로 결합 하는 멀티 캐스트 대리자입니다.By default, the backing-store field for an event declaration is a multicast delegate that serially combines all the event handlers. 즉, 한 처리기를 완료 하는 데 시간이 오래 걸리면 다른 처리기가 완료 될 때까지 차단 됩니다.This means that if one handler takes a long time to complete, it blocks the other handlers until it completes. 잘 작동 하는 이벤트 처리기는 긴 작업 또는 잠재적으로 차단 되는 작업을 수행 하지 않아야 합니다.(Well-behaved event handlers should never perform lengthy or potentially blocking operations.)

Visual Basic에서 제공 하는 이벤트의 기본 구현을 사용 하는 대신 사용자 지정 이벤트를 사용 하 여 이벤트 처리기를 비동기적으로 실행할 수 있습니다.Instead of using the default implementation of events that Visual Basic provides, you can use a custom event to execute the event handlers asynchronously.

Example

이 예제에서 접근자는 AddHandler 이벤트의 각 처리기에 대 한 대리자를 Click ArrayList 필드에 저장 된에 추가 합니다 EventHandlerList .In this example, the AddHandler accessor adds the delegate for each handler of the Click event to an ArrayList stored in the EventHandlerList field.

코드가 이벤트를 발생 시키면 Click 접근자는 RaiseEvent 메서드를 사용 하 여 모든 이벤트 처리기 대리자를 비동기식으로 호출 합니다 BeginInvoke .When code raises the Click event, the RaiseEvent accessor invokes all the event handler delegates asynchronously using the BeginInvoke method. 이 메서드는 작업자 스레드의 각 처리기를 호출 하 고 즉시 반환 하므로 처리기는 서로를 차단할 수 없습니다.That method invokes each handler on a worker thread and returns immediately, so handlers cannot block one another.

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

참조See also