WPF中的命令绑定内存泄漏问题

6
当我创建一个具有对RoutedUICommand的CommandBinding的用户控件时,我担心会出现内存泄漏。
场景:
在C类中将RoutedUICommand作为静态存储我的命令。 在用户控件上实现CommandBindings。 将用户控件添加到主表单中。 从主表单中删除用户控件,将引用设置为null。
命令绑定的canExecute继续触发。我没有对UserControl的引用,因此它被泄漏了,并且在关闭表单后长时间持续触发。(我没有看到它停止)如果我强制进行垃圾回收,它将被收集(好吧,canExecute停止触发)
我有一个名为project的测试,可以说明这一点。我在canExecute中有一个Console.WriteLine,打印出触发该方法的对象的哈希码。它有一个按钮来添加新用户控件和一个按钮来删除它。

我应该不用担心这个吗?如果被强制收集,用户控件确实会被收集。这是否意味着它将在下一次收集时被收集?我注意到我们的应用程序性能下降,并跟踪内存泄漏等问题。我们有复杂的表单和许多UI元素,它们挂起并占用处理器和内存空间,当从布局中移除时(我们使用许多命令)。我以为一旦从可视树中删除,它就不能再接收路由事件了。我错过了什么?

1个回答

2
据我所知,命令绑定使用类似于(但不完全相同)WeakEvent模式的东西。

基本上,它会保留一个WeakReference。这将允许在您的引用消失后继续工作,但不会防止您的类被GC收集,因为没有任何其他引用它。

简而言之,请放心-它正在按照预期运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接