c#中的事件处理器和应用程序生命周期对象

假设我有一个在应用程序期间存在的对象。 我们称之为GlobalWorker。 GlobalWorker具有其他对象可以订阅的事件,例如UserLoggedIn。 现在想象我已经有了一个Silverlight页面或一个asp.net页面或者什么,它在构建时订阅了UserLoggedIn事件。

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

private void OnLoggedIn(object sender, EventArgs e)
{

}

此事件的存在是否阻止垃圾收集页面? 如果是这样,在这种情况下最好使用什么模式:弱事件处理程序,将订阅移动到Load事件并在UnLoad事件中取消订阅?


使用弱事件。

这是WPF中的一个常见问题,您好好考虑一下。


是的,这种行为阻止了页面成为GC。

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

您可以使用弱事件作为另一张海报,您也可以在一定程度上重新考虑您的设计,并查看是否可以功能化或封装事件行为。 在这种情况下,数据可能是全球性的(用户凭证),因为事件可以保持孤立。

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

链接地址: http://www.djcxy.com/p/49005.html

上一篇: Eventhandlers and application lifetime objects in c#

下一篇: Read barcode when program doesn't have focus?