当我创建一个具有对RoutedUICommand的CommandBinding的用户控件时,我担心会出现内存泄漏。
场景:
在C类中将RoutedUICommand作为静态存储我的命令。 在用户控件上实现CommandBindings。 将用户控件添加到主表单中。 从主表单中删除用户控件,将引用设置为null。
命令绑定的canExecute继续触发。我没有对UserControl的引用,因此它被泄漏了,并且在关闭表单后长时间持续触发。(我没有看到它停止)如果我强制进行垃圾回收,它将被收集(好吧,canExecute停止触发)
我有一个名为project的测试,可以说明这一点。我在canExecute中有一个Console.WriteLine,打印出触发该方法的对象的哈希码。它有一个按钮来添加新用户控件和一个按钮来删除它。
场景:
在C类中将RoutedUICommand作为静态存储我的命令。 在用户控件上实现CommandBindings。 将用户控件添加到主表单中。 从主表单中删除用户控件,将引用设置为null。
命令绑定的canExecute继续触发。我没有对UserControl的引用,因此它被泄漏了,并且在关闭表单后长时间持续触发。(我没有看到它停止)如果我强制进行垃圾回收,它将被收集(好吧,canExecute停止触发)
我有一个名为project的测试,可以说明这一点。我在canExecute中有一个Console.WriteLine,打印出触发该方法的对象的哈希码。它有一个按钮来添加新用户控件和一个按钮来删除它。
我应该不用担心这个吗?如果被强制收集,用户控件确实会被收集。这是否意味着它将在下一次收集时被收集?我注意到我们的应用程序性能下降,并跟踪内存泄漏等问题。我们有复杂的表单和许多UI元素,它们挂起并占用处理器和内存空间,当从布局中移除时(我们使用许多命令)。我以为一旦从可视树中删除,它就不能再接收路由事件了。我错过了什么?