我有一个类,似乎递归添加EventHandler到事件。我查看了代码,但其上没有AddHandler
,并且Handles
子句中只有一种方法。管理事件的事件处理程序
在内存分析器中,它显示事件处理程序正在调用正在调用事件处理程序的事件处理程序等等,以执行相当多的步骤。
这可能是由于什么原因造成的?为了解决这个问题,处理这种情况有什么好的方法?
P.S.我对这整个记忆分析的新事物是新的,所以要对我轻描淡写)。
我有一个类,似乎递归添加EventHandler到事件。我查看了代码,但其上没有AddHandler
,并且Handles
子句中只有一种方法。管理事件的事件处理程序
在内存分析器中,它显示事件处理程序正在调用正在调用事件处理程序的事件处理程序等等,以执行相当多的步骤。
这可能是由于什么原因造成的?为了解决这个问题,处理这种情况有什么好的方法?
P.S.我对这整个记忆分析的新事物是新的,所以要对我轻描淡写)。
这听起来更像是你有一个偶的处理程序再次触发事件。告诉这个最简单的方法是在处理程序中设置一个断点,看它是否意外地重新进入处理程序。如果是这样,你可以看看堆栈跟踪,并找出你正在做什么来再次触发事件。
如果它是可能被暂停的影响(Paint
,例如)的事件,你可以在处理程序中写入Console
以及并打印出Environment.StackTrace
获得快照不暂停执行。
我想到了这个过程,并在包含'Handles'子句的方法的签名中设置了一个断点,但它从来没有到达过。对于我正在调试的操作(即疯狂地消耗RAM),该方法从未得到执行。 – PedroC88 2011-03-21 19:57:29
@ PedroC88:在这种情况下,这与您的事件处理程序无关。您需要在任何函数*中重复调用相同的内容。如果不清楚,请发布代码示例。 – 2011-03-21 19:59:43
我真的不能发布代码(尽管我知道这样很难帮助其他人),但我明白你的建议。我知道哪种方法被重复调用,但我应该在其中寻找什么? – PedroC88 2011-03-21 20:13:37
您正在使用哪种语言?在C#中,添加事件处理程序也支持“+ =”语法。 – 2011-03-21 19:50:32
@劳伦斯:鉴于他提到了'AddEventHandler'(我相信这是'AddHandler')和'Handles',它只能是VB.NET – 2011-03-21 19:51:45
我正在使用VB.NET ...但是什么是知道为什么EventHandler不断添加“递归”以避免它。 – PedroC88 2011-03-21 19:52:34