我有一個類,似乎遞歸添加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