当我创建一个具有CommandBinding到RoutedUICommand的用户控件时,我担心会出现内存泄漏。
情形:
在我存储命令的c类中有一个RoutedUICommand作为静态 在用户控件上实现CommandBindings。 将用户控件添加到主窗体。 从主窗体中删除用户控件,将对它的引用设置为null。
命令绑定的canExecute继续触发。我没有对UserControl的引用,所以它泄露了。表格关闭后,它会长时间保持射击状态。 (我没有看到它停止)如果我强制收集垃圾,它会被收集(canExecute停止开火)
我有一个测试project来说明这一点。我在canExecute中有一个Console.WriteLine,它打印出触发该方法的对象的哈希码。它有一个用于添加新用户控件的按钮和一个用于删除它的按钮。
我不应该关心这个吗?如果强制,则会收集用户控件。这是否意味着它会在下一个系列中收集?我注意到我们的应用程序性能下降,并且正在跟踪内存泄漏等。我们有许多ui元素的复杂表单,当从布局中删除时,它们会闲置处理器和内存空间。 (我们使用了很多命令)我认为一旦从可视树中删除了某些内容,就无法再接收路由事件了。我错过了什么?
答案 0 :(得分:1)
根据我的理解,命令绑定使用与WeakEvent pattern类似的(但不相同)。
基本上,WeakReference被举行。这将允许它在您的引用消失后工作,但不会阻止您的类在没有其他任何引用时被GC收集。
简而言之,请不要担心 - 它的工作方式应该是正常的。