【发布时间】:2014-02-20 12:51:44
【问题描述】:
我正在使用来自 XML 文件的条目填充 ToolStripMenu。添加到菜单中的每个ToolStripItem 都会自动获得大约十几个分配给它的事件处理程序。用户可以选择更改XML 并刷新菜单,这会清除所有内容:
menuStrip1.Items.Clear();
这将从XML 重新填充并刷新表单。似乎所有这些动态项的事件处理程序从未从内存中删除。大多数项目并不直接位于 menuStrip1 上,而是位于位于menuStrip1 上的动态创建的子菜单中。
尽管如此,我可以坐在那里刷新表单并且内存只是膨胀失控,每次刷新大约 100 dynamic ToolStripItems. 添加5-10 MB 它可以迅速达到数百 MB 导致应用程序崩溃。
ToolStripItems 还加载其他内容,例如属性和图标,但似乎是事件处理程序使用了大部分添加的内存。我注释掉了所有的处理程序,每次刷新时内存变得更加(但不是完全)可持续。
是否有必要枚举所有菜单和子菜单并单独释放每个事件处理程序以确保它不会留下来?
【问题讨论】:
-
您可能应该对每个人调用
Dispose以释放他们的资源。 -
如果你同时处理/删除事件处理程序和它订阅的对象,你应该没问题。否则,是的,您可能必须取消订阅每个处理程序(或查看不同的订阅方式——不是编译器生成的事件)
-
您可能想查看Weak Event Pattern
-
你们中的一个人应该回答,以便我可以标记为已回答。长话短说似乎 C# 并不像我想象的那样勤奋记忆。谢谢你的课。
标签: c# winforms memory-leaks toolstripmenu