我使用XML
文件的條目填充ToolStripMenu
。添加到菜單中的每個ToolStripItem
會自動獲取大約12個分配給它的事件處理程序。用戶必須改變XML
並刷新菜單,使用它會清除所有的選項:爲動態創建的項目發佈事件處理程序
menuStrip1.Items.Clear();
這重新填充來自XML
並刷新表格。看來,所有這些動態項目的事件處理程序都不會從內存中刪除。大多數項目不直接坐在menuStrip1上,而是在menuStrip1
上動態創建的子菜單中。不過,我可以坐在那裏刷新表格和內存,只是氣球失去控制,每增加約100 dynamic ToolStripItems.
就會增加5-10 MB
它可以快速達到數百MB,這會使應用程序崩潰。
ToolStripItems
也加載其他東西,如屬性和圖標,但它似乎是使用大部分增加的內存的事件處理程序。我評論了所有的處理程序,每次刷新後內存變得更多(但不是完全)可持續。
是否有必要枚舉所有的菜單和子菜單,並單獨釋放每個事件處理程序以確保它不會粘住?
你可能應該在每一個上調用Dispose來釋放他們的資源。 – tvanfosson
如果您處理/刪除事件處理程序*和*它所訂閱的對象,則應該是正常的。否則,是的,你可能不得不取消訂閱每個處理程序(或者看看不同的訂閱方式 - 而不是編譯器生成的事件) –
你可能想要查看[弱事件模式](http://msdn.microsoft.com/ 。com/en-us/library/aa970850%28v = vs.110%29.aspx) –