我的问题与事件有关:
我有一个TaskAComplete
事件的类,当TaskA
完成时会引发该事件。
按下按钮时,我订阅了TaskACompleteEvent
MyObject.TaskAComplete += new EventHandler(MethodToCall);
但在其他活动中,我想在第一次发生活动时取消订阅TaskAComplete
活动。
使用:
MyObject.TaskAComplete -= MethodToCall;
然后在下次按下按钮时再次订阅TaskAComplete
事件。
现在当我启动应用程序并在第一次正确引发事件时点击按钮。但是当我第二次点击按钮时,事件连续两次加注。 (第三次点击 - >事件连续三次提升,等等......)
当我在表单的构造函数中订阅事件时,它每次点击只会引发一次。
为什么赛事会多次出现?
答案 0 :(得分:1)
订阅活动时,您通过向方法提供委托进行订阅。委托实际上是一种强类型,面向对象的C / C ++函数指针方法。
然后该代表进入该事件的调用列表。
执行new EventHandler(MethodToCall)
时,您明确地创建了该委托。但是,当您执行-= MethodToCall
时,您将删除“自动”代理。就像你写了-= new EventHandler(MethodToCall)
一样。显然,这个新委托不是调用列表中的委托。
要执行您想要的操作,在添加时,您需要将新代理保存在变量中,稍后可以删除该变量。例如:
var handler = new EventHandler(MethodToCall);
MyObject.TaskAComplete += handler;
// later on
MyObject.TaskAComplete -= handler;
答案 1 :(得分:0)
您只需订阅一次事件即可。如果您使用相同的处理程序多次订阅,那么将像您看到的那样多次调用该处理程序。
您为什么要首先取消订阅TaskAComplete
活动?如果您的其他代码是正确的,那么每次任务都会得到一次。