我在用户控件中有以下代码行:
Application.Current.RootVisual.MouseLeftButtonDown += RootClicked;
当它被定义时,父用户控件不再被 GC 收集或销毁,即使 RootClicked 事件不再处于事件状态,它也会继续触发。
如果我添加:
Application.Current.RootVisual.MouseLeftButtonDown -= RootClicked;
问题不再存在。
知道这是为什么吗?有没有我应该明确删除事件的函数?
最佳答案
这是正常行为,也是 .NET 中内存泄漏的常见来源。
当您将对象 A 的实例方法附加到对象 B 的事件时,您将在事件接收器列表中添加 A 的实例,因此垃圾收集器无法释放对象 A,直到您删除处理程序或您释放对对象 A 和 B 的所有引用。 这是预期的正常行为。
有两种常见的解决方法:
1) 当您不再需要对象 A 时,您从事件中取消订阅对象 A。
2) 您使用弱事件,就像 WPF 那样。 弱事件通常使用 WeakReference 类实现,您可以在网上找到更多信息。
关于c# - 当事件附加到它时,UserControl 不会被销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8059471/