c# - 当事件附加到它时,UserControl 不会被销毁

标签 c# silverlight events

我在用户控件中有以下代码行:

Application.Current.RootVisual.MouseLeftButtonDown += RootClicked;

当它被定义时,父用户控件不再被 GC 收集或销毁,即使 RootClicked 事件不再处于事件状态,它也会继续触发。

如果我添加:

Application.Current.RootVisual.MouseLeftButtonDown -= RootClicked;

问题不再存在。

知道这是为什么吗?有没有我应该明确删除事件的函数?

最佳答案

这是正常行为,也是 .NET 中内存泄漏的常见来源。

当您将对象 A 的实例方法附加到对象 B 的事件时,您将在事件接收器列表中添加 A 的实例,因此垃圾收集器无法释放对象 A,直到您删除处理程序或您释放对对象 A 和 B 的所有引用。 这是预期的正常行为。

有两种常见的解决方法:

1) 当您不再需要对象 A 时,您从事件中取消订阅对象 A。

2) 您使用弱事件,就像 WPF 那样。 弱事件通常使用 Wea​​kReference 类实现,您可以在网上找到更多信息。

关于c# - 当事件附加到它时,UserControl 不会被销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8059471/

相关文章:

c# - wa=wsignupcleanup1.0 不会在依赖方注销用户

C# Protractor - 在另一个元素中查找元素

html - 如何将HTML内容插入到Silverlight中?是否可以?

android - 在 Kotlin 中处理事件总线的通用监听器

vba - 在 VBA 中无法从工作簿事件处理程序 Workbook_BeforeClose 或 Workbook_Deactivate() 调用工作表中的子例程

c# - Uwp 在用户登录时执行后台任务

Silverlight MouseLeave 显示不一致的行为

wcf - 在 Silverlight 中向 WCF 添加压缩的最简单方法是什么?

c# - 如何禁用从一种类型的多个实例订阅事件并只允许一个?

c# - 通过 ASP.NET 按钮在 aspx 页面中导航 anchor 标记