2009-11-05 4 views
0

좋아, 내가 winforms 애플 리케이션과 내 코드가 잘 작동합니다. 하지만 내 코드가 방탄인지 또는 부하없이 작동하는지 알고 싶습니다.vb.net - 처리 된 속성이있는 이벤트. 이 방법은 저장됩니까?

내가 그것을 설명하자

를 나는 내가 메서드 OnKeyDown 오버라이드 (override) 한 윈도우 형태가 있습니다

Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs) 

     dim args as new ActionEventArgs(ActionType.Bark) 
     RaiseEvent Action(me, args) 

     e.Handled = args.Handled 
     MyBase.OnKeyDown(e) 

    End Sub 

을 당신은 내가 사용자 정의 이벤트를 발생하고 이후 그것의 취급 변수를 쿼리 볼 수 있듯이 . 내 이벤트/ActionEventArgs은 다음과 같습니다

ActionType이 열거에게 있습니다
Public Event Action(sender as Object, e as ActionEventArgs) 

    Public Class ActionEventArgs 
     Inherits EventArgs 

     Public Handled as Boolean 
     Public Action as Action 
     Public Sub New(ByVal action as ActionType) 
      Me.Action = action 
     End Sub 
    End Class 

이제
Public Enum ActionType 
     Bark, 
     Jump, 
     FireNukeWithoutFurtherWarning 
    End Enum 

내가 가지고는 ActionType에게 그것을 처리하는 방법을 알고 있다면,이 이벤트에 등록하고 클래스 Handled를 true로 설정합니다.

Public Sub actionHandler(ByVal sender as Object, e as ActionEventArgs) Handles me.Action 

     If e.Handled then return 

     If e.Action = ActionType.Bark 
      Bark() 
      e.Handled = true 
     End If 
    End If 

개발자 컴퓨터에서이 코드를 시도했지만 제대로 작동하는 것 같습니다. OnKeyDown 메서드에서 Handled 변수를 쿼리 할 때마다 actionHandler 메서드가 먼저 실행되었습니다. 내 개발자 컴퓨터가 유휴 상태에 있고 이벤트 큐가 너무 빨리 처리 또는 내가 모든 등록 된 이벤트 핸들러는 그것의 완료 될 때까지

RaiseEvent(...) 

방법은 기다릴 것으로 예상 할 수 있기 때문이는 경우에 해당
하지만 나 한테 물어 taks?

답변

3

이벤트를 발생시키는 것은 메서드를 호출하는 것과 똑같습니다 (구체적으로는 실행될 다른 메서드에 대한 포인터 목록 인 MulticastDelegate입니다). 코드는 다음 진술을 계속하기 전에 모든 이벤트 핸들러를 처리합니다.

1

RaiseEvent는 '정상'이벤트가 비동기 적으로 발생하지 않으므로 각 이벤트가 완료 될 때까지 대기합니다. RaiseEvent는 Handler 목록을 탐색하고 각각을 호출하는 것 이상을 수행하지 않습니다.