C#:多次事件提升

时间:2012-02-17 11:01:15

标签: c# .net events

我的问题与事件有关:

我有一个TaskAComplete事件的类,当TaskA完成时会引发该事件。

按下按钮时,我订阅了TaskACompleteEvent

MyObject.TaskAComplete += new EventHandler(MethodToCall);

但在其他活动中,我想在第一次发生活动时取消订阅TaskAComplete活动。

使用:

MyObject.TaskAComplete -= MethodToCall;

然后在下次按下按钮时再次订阅TaskAComplete事件。

现在当我启动应用程序并在第一次正确引发事件时点击按钮。但是当我第二次点击按钮时,事件连续两次加注。 (第三次点击 - >事件连续三次提升,等等......)

当我在表单的构造函数中订阅事件时,它每次点击只会引发一次。

为什么赛事会多次出现?

2 个答案:

答案 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活动?如果您的其他代码是正确的,那么每次任务都会得到一次。