【问题标题】:Addhandler, removehandler添加处理程序,删除处理程序
【发布时间】:2017-11-21 12:39:50
【问题描述】:

假设我喜欢这样两次:

AddHandler grid.SelectedIndexChanged, AddressOf doSomething
AddHandler grid.SelectedIndexChanged, AddressOf doSomething

根据我的调查,它将被订阅并每次启动两次。意味着我可以根据需要多次订阅同一个处理程序。

但这是否意味着当我像这样只在某个地方做一次时:

RemoveHandler grid.SelectedIndexChanged, AddressOf doSomething
  1. 这是否意味着我仍然有一个“相同的订阅者”权限,因此根据上述示例处理程序将在删除一次后调用一次?
  2. 这是因为我必须始终删除处理程序,就像我添加它一样?
  3. 当我为特定事件执行的 removehandler 命令比我添加的多时会怎样?
  4. 有没有办法从特定事件中删除所有订阅者?我问是因为

说明:我有一个由以前的开发人员开发的大型项目,他总是在做addhandler,从很多不同的地方删除处理程序......我认识到有时即使在特定时间不应该是任何订阅者离开(他的 removehandler ..)他们甚至运行了几次相同的处理程序被调用!问题是表单包含“长寿对象”,我现在正在努力解决这个项目。希望能得到你的帮助。

谢谢!

【问题讨论】:

  • 您的问题点 1 到 3 是您可以自己测试的内容。第四点是您可以简单地自己搜索并获得的内容,例如,this
  • 虽然上面的评论可能很明显,但我有完全相同的问题,这个问题现在首先把我带到了 SO 网站,并帮助我解决了这些问题。

标签: vb.net


【解决方案1】:

您只需要尝试一下。将调用两个事件,一次将删除一个事件。

Module Module1

    Delegate Sub TestDelegate()

    Event TestEvent As TestDelegate

    Sub Main()

        AddHandler TestEvent, AddressOf TestFunc
        AddHandler TestEvent, AddressOf TestFunc

        Console.WriteLine("---")
        RaiseEvent TestEvent() ' 'a' writted twice

        RemoveHandler TestEvent, AddressOf TestFunc

        Console.WriteLine("---")
        RaiseEvent TestEvent() ' 'a' written once

        RemoveHandler TestEvent, AddressOf TestFunc

        Console.WriteLine("---")
        RaiseEvent TestEvent() ' 'a' not written

        RemoveHandler TestEvent, AddressOf TestFunc ' No error hapenning

        Console.ReadLine()

    End Sub

    Public Sub TestFunc()

        Console.WriteLine("a")

    End Sub

End Module

要删除所有事件,请检查these questions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2012-05-13
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多