我怎么知道.net事件是否已被处理?

Dan*_*don 11 .net vb.net events event-handling

我写了一些代码来处理事件,如下所示:

AddHandler myObject.myEvent, AddressOf myFunction
Run Code Online (Sandbox Code Playgroud)

似乎一切都在工作,但是当我运行调试器时,我发现通常myFunction每次都会运行几次myObject.myEvent.我发现我已经允许代码添加事件处理程序多次运行,从而导致此行为.

有没有办法可以做这样的事情?

If myObject.myEvent is not handled Then
  AddHandler myObject.myEvent, AddressOf myFunction
End If
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 14

假设您的代码不是发布事件的代码,则不能.这个想法是订阅者彼此隔离 - 你无法找到其他活动订阅者,自己提出活动等.

如果问题是,将自己的处理程序多次,你应该能够修复自己被跟踪是否已经添加了一个处理程序.Steven在添加处理程序之前删除处理程序的想法是一个有趣的解决方法:尝试删除处理程序即使它没有订阅也是有效的.但是,我认为这是一个解决方案,你的应用程序不知道它应该做什么.这是一个非常快速的短期修复,但我担心长期留下它.

  • “医生,我这样做很痛。” “所以不要这样做。” (2认同)

Ste*_*dit 7

或者:

  1. 不要多次添加处理程序.

  2. 尝试在添加之前删除处理程序.

  • 我虽然它也抛出一个空引用,但事实并非如此.如果对象不存在,则抛出null错误.删除myObject.myEvent上的Handler,如果myObject不存在则会抛出错误. (3认同)

hma*_*man 5

我知道这是一篇旧文章,但只是想为那些朝这个方向寻找的人添加一个解决方案......

VB.Net 按照以下模式创建一个特殊的私有成员变量,<YourEvent>Event然后您可以使用它来测试 Nothing。

Public Event MyClick As EventHandler

Private Sub OnMyClick()
    If MyClickEvent IsNot Nothing Then
        RaiseEvent MyClick(Me, New EventArgs())
    Else
        ' No event handler has been set.
        MsgBox("There is no event handler. That makes me sad.")
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

答案来自这里:确定事件是否已附加到