2009-11-05 27 views
0

好吧,我有一個winforms應用程序,我的代碼工作正常。 但我想知道,如果我的代碼是防彈的,或者它只能在沒有負載的情況下工作。vb.net - 處理過的屬性的事件。這樣保存嗎?

讓我來解釋一下:

我有,我已經覆蓋了的onkeydown方法的窗口形式:

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看起來是這樣的:

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 

現在我有註冊到這個事件,如果它知道如何處理的操作類型是一個類將Handle設置爲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無非是通過處理程序列表並調用每個處理程序。

相關問題