6

当我创建一个具有到 RoutedUICommand 的 CommandBinding 的用户控件时,我担心我会出现内存泄漏。

设想:

将 RoutedUICommand 作为 c 类中的静态对象,我在其中存储我的命令 在用户控件上实现 CommandBindings。将用户控件添加到主窗体。从主窗体中删除用户控件,将对它的引用设置为空。

命令绑定的 canExecute 继续触发。我没有对 UserControl 的引用,所以它泄露了。并且在表单关闭后会持续触发很长时间。(我还没有看到它停止)如果我强制垃圾收集它会被收集(好吧 canExecute 停止触发)

我有一个测试项目来说明这一点。我在 canExecute 中有一个 Console.WriteLine,它打印出触发该方法的对象的哈希码。它有一个添加新用户控件的按钮和一个删除它的按钮。

我不应该关心这个吗?如果强制,用户控件会被收集。这是否意味着它将在下一次收集时收集?我注意到我们的应用程序的性能下降并且正在跟踪内存泄漏等。我们有复杂的表单,其中包含很多 ui 元素,当从布局中删除时,它们会占用处理器和内存空间。(我们使用了很多命令)我认为一旦从可视化树中删除了某些东西,它就无法再接收路由事件。我错过了什么?

4

1 回答 1

2

据我了解,命令绑定使用类似于(但不相同)的WeakEvent 模式

基本上,一个WeakReference被持有。这将允许它在您的引用消失后工作,但不会阻止您的类在没有其他引用时被 GC 收集。

简而言之,别担心——它正在按照它应该的方式工作。

于 2010-01-08T05:55:51.537 回答