c#中的事件处理程序和应用程序生命周期对象 - 我应该解开吗?

时间:2010-11-22 18:55:10

标签: c# event-handling

假设我有一个在应用程序持续时间内存在的对象。我们称之为GlobalWorker。 GlobalWorker有例如UserLoggedIn,其他对象可以订阅。现在想象一下,我有一个Silverlight页面或一个asp.net页面,它在构造时订阅了UserLoggedIn事件。

public SomePage()
{
GlobalWorker.Instance.UserLoggedIn += new EventHandler(OnUserLoggedIn);
}

private void OnLoggedIn(object sender, EventArgs e)
{

}

是否存在此事件会阻止页面被垃圾回收?如果是这样,在这个实例中使用的最佳模式是什么:弱事件处理程序,将订阅移动到Load事件并取消订阅UnLoad事件?

2 个答案:

答案 0 :(得分:3)

使用Weak Events

这是WPF中的一个常见问题,您可以考虑它。

答案 1 :(得分:1)

是的,该行为会阻止该页面成为GC。

原因是UserLoggedIn将无限期地保留对SomePage的引用。没有明确删除处理程序,因为weak events没有被使用,它也不会被隐式删除。

您可以使用弱事件作为另一张海报说明,您也可以在某种程度上重新考虑您的设计,看看您是否可以功能化或封装事件行为。也许数据在这个实例中需要全局(用户凭证),因为事件可以保持隔离。

如果这是您关心的一次性事件,您也可以在处理程序中取消注册。它实际上归结为您的特定需求和实例,弱事件模式是处理此应用程序范围的模式,但并不意味着您必须在此问题出现的每个实例中使用该模式。