vb.net – 一次删除所有事件处理程序

vb.net – 一次删除所有事件处理程序,第1张

概述问题:我有一个包含对象列表的文档类.这些对象引发了诸如SolutionExpired,DisplayExpired等事件.文档需要响应这一点. 文档有时可以交换对象,但是单个对象永远不应该是多个文档的“一部分”. 我的文档类包含许多用作事件处理程序的方法.每当一个对象进入文档时,我使用AddHandler来设置事件,每当从文档中删除一个对象时,我使用RemoveHandler来撤消损坏.但是,有些 问题:我有一个包含对象列表的文档类.这些对象引发了诸如SolutionExpired,displayExpired等事件.文档需要响应这一点.

文档有时可以交换对象,但是单个对象永远不应该是多个文档的“一部分”.

我的文档类包含许多用作事件处理程序的方法.每当一个对象进入文档时,我使用AddHandler来设置事件,每当从文档中删除一个对象时,我使用RemoveHandler来撤消损坏.但是,有些情况下很难确保所有步骤都得到适当的处理,因此我最终可能会遇到流氓事件处理程序.

长话短说;如何删除指向特定方法的所有处理程序?注意,我没有可能的事件源列表,这些可以存储在任何地方.

就像是:

RemoveHandler *.solutionExpired,AddressOf DefObj_SolutionExpired
解决方法 您可以使用Delegate.RemoveAll(). (您感兴趣的部分是button2_Click)

public voID Form_Load(object sender,EventArgs e) {     button1.Click += new EventHandler(button1_Click);    button1.Click += new EventHandler(button1_Click);    button2.Click += new EventHandler(button2_Click);    TestEvent += new EventHandler(Form_TestEvent);}event EventHandler TestEvent;voID OnTestEvent(EventArgs e){    if (TestEvent != null)        TestEvent(this,e);}voID Form_TestEvent(object sender,EventArgs e){    MessageBox.Show("TestEvent fired");}voID button2_Click(object sender,EventArgs e){    Delegate d = TestEvent as Delegate;    TestEvent = Delegate.RemoveAll(d,d) as EventHandler;}voID button1_Click(object sender,EventArgs e){    OnTestEvent(EventArgs.Empty);}

您应该注意,它不会改变您传递给它的代理的内容,它会返回一个更改的委托.因此,您将无法更改从表单上删除表单上的按钮上的事件,因为button1.Click只能使用=或 – =,而不是=.这不会编译:

button1.Click = Delegate.RemoveAll(d,d) as EventHandler;

此外,请确保无论您在何处实施此项目,都要注意竞争条件的潜力.如果你要从另一个线程调用的事件中删除处理程序,你可能会遇到一些非常奇怪的行为!

总结

以上是内存溢出为你收集整理的vb.net – 一次删除所有事件处理程序全部内容,希望文章能够帮你解决vb.net – 一次删除所有事件处理程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1239133.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存