2011-06-20 201 views
5

鉴于WebForm中的所有控件都在每次回发结束时被销毁(通过我的了解),您是否需要“取消”任何可能具有的事件处理程序有线吗? (假设你要停止处理事件,并允许GC)所以您是否需要在ASP.NET webforms中“unwire”事件处理程序

例如:

public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Do I need to remove this handler? 
     btnSubmit.ServerClick += btnSubmit_ServerClick; 
    } 
} 

回答

3

不太可能。如果我记得正确,您的WebForm1实例的生命周期就在Unload事件之后结束。在提供页面和清理完成之后,并不像持续提及WebForm1类。

2

不,你不必。他们将被垃圾收集。

0

我设法使用动态控件创建一个Web应用程序(WebForm),我不得不“断开”我的事件,否则页面变得越来越慢。我认为GC已经关注的“旧”页面仍然存在。当我在Page_Unload中取消绑定事件时,我的应用程序不再继续为不存在的页面引发事件。

这只发生在我身上一次,而这可能是由于应用程序的动态性质。

只是回味无穷:)

0

这太简单化假设一个WebForm是短暂的 - 在这个例子中,你看起来很好,但一般而言,您应该谨慎。

就在今天,我遇到了一个很好的例子,类似于@thmsn,在ASP.NET WebForms应用程序中未能解除事件处理程序导致令人讨厌的内存泄漏。

在这种情况下,几乎所有页面中使用的母版页都订阅了其Page_Init中的对象事件。所讨论的对象是长期存在的,并且在ASP.NET会话中持久化,并且该站点被配置为使用InProc会话存储并且超时60分钟。如果无法断开事件处理程序,则意味着该对象只要存活(至少每小时一个小时),就会阻止在会话期间访问的所有页面的GC被访问。

快速修复方法是取消Page_Unload中的事件处理程序 - 此示例显示页面的生命周期很容易被无意间扩展到超过其有效生命周期。我不会在这里使用Session,尽管它远非理想 - 我也看到类似的错误引入了来自对象的反向引用,这些对象的页面生存期比适当的长。

+0

事件处理程序不以任何方式延长事件对象的生命周期,只要具有事件的对象处于活动状态,它就会延长具有处理程序的对象的生命周期,因此您描述的情况是不可能的。你拥有的对象必须既是引用页面(而不是其他方式)。 – Servy

+0

简单的错字 - 订阅对象的事件(而非处理程序)。纠正。相信我,我已经有了!dumpheap来证明泄漏!干杯:)在会话中订阅对象上的事件意味着该对象将引用返回到页面,并保持活动状态。 –

+0

为事件订阅事件处理程序不会导致处理程序具有对定义事件的对象的引用的对象。你可以在你的情况下明确地创建这样的参考;这很容易做到,但事件订阅并不一定会发生,这意味着取消订阅事件处理程序也不会消除您的问题。现在,如果您的页面实例为长期存在的其他对象订阅了一个事件处理程序,那么只要该另一个对象在附近,* that *就会保留该页面,但这是一种不同的情况。 – Servy

相关问题