假设我有一个在应用程序持续时间内存在的对象。我们称之为GlobalWorker。 GlobalWorker有例如UserLoggedIn,其他对象可以订阅。现在想象一下,我有一个Silverlight页面或一个asp.net页面,它在构造时订阅了UserLoggedIn事件。
public SomePage()
{
GlobalWorker.Instance.UserLoggedIn += new EventHandler(OnUserLoggedIn);
}
private void OnLoggedIn(object sender, EventArgs e)
{
}
是否存在此事件会阻止页面被垃圾回收?如果是这样,在这个实例中使用的最佳模式是什么:弱事件处理程序,将订阅移动到Load事件并取消订阅UnLoad事件?
答案 0 :(得分:3)
使用Weak Events。
这是WPF中的一个常见问题,您可以考虑它。
答案 1 :(得分:1)
是的,该行为会阻止该页面成为GC。
原因是UserLoggedIn将无限期地保留对SomePage的引用。没有明确删除处理程序,因为weak events没有被使用,它也不会被隐式删除。
您可以使用弱事件作为另一张海报说明,您也可以在某种程度上重新考虑您的设计,看看您是否可以功能化或封装事件行为。也许数据在这个实例中需要全局(用户凭证),因为事件可以保持隔离。
如果这是您关心的一次性事件,您也可以在处理程序中取消注册。它实际上归结为您的特定需求和实例,弱事件模式是处理此应用程序范围的模式,但并不意味着您必须在此问题出现的每个实例中使用该模式。