방법: 차단을 방지하는 사용자 지정 이벤트 선언(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
참고 항목
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET