当我创建一个具有到 RoutedUICommand 的 CommandBinding 的用户控件时,我担心我会出现内存泄漏。
设想:
将 RoutedUICommand 作为 c 类中的静态对象,我在其中存储我的命令 在用户控件上实现 CommandBindings。将用户控件添加到主窗体。从主窗体中删除用户控件,将对它的引用设置为空。
命令绑定的 canExecute 继续触发。我没有对 UserControl 的引用,所以它泄露了。并且在表单关闭后会持续触发很长时间。(我还没有看到它停止)如果我强制垃圾收集它会被收集(好吧 canExecute 停止触发)
我有一个测试项目来说明这一点。我在 canExecute 中有一个 Console.WriteLine,它打印出触发该方法的对象的哈希码。它有一个添加新用户控件的按钮和一个删除它的按钮。
我不应该关心这个吗?如果强制,用户控件会被收集。这是否意味着它将在下一次收集时收集?我注意到我们的应用程序的性能下降并且正在跟踪内存泄漏等。我们有复杂的表单,其中包含很多 ui 元素,当从布局中删除时,它们会占用处理器和内存空间。(我们使用了很多命令)我认为一旦从可视化树中删除了某些东西,它就无法再接收路由事件。我错过了什么?