您是否需要在ASP.NET webforms中“取消”事件处理程序

时间:2011-06-20 19:15:10

标签: c# asp.net events delegates event-handling

鉴于每次回发结束时WebForm中的所有控件都被销毁(据我的理解),您是否需要“解锁”您可能连接的任何事件处理程序? (假设您要停止处理事件并允许GC)

例如:

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; 
    }
}

4 个答案:

答案 0 :(得分:3)

不太可能。如果我没记错的话,你的WebForm1实例的生命周期就会在Unload事件之后结束。在提供页面并完成清理后,并不是继续引用您的WebForm1类。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我设法使用动态控件创建一个Web应用程序(WebForm),我不得不" unwire"我的事件,否则页面变得越来越慢。 " old"我认为GC已经关注的页面仍然存在。当我在Page_Unload中解除事件时,我的应用程序不再继续为不存在的页面引发事件。

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

只是值得深思:)

答案 3 :(得分:0)

假设WebForm是短暂的过于简单化 - 在这个例子中你看起来很好,但一般来说你应该小心。

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

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

快速解决方法是在Page_Unload中取消连接事件处理程序 - 这个示例表明,页面的生命周期很容易被无意中扩展到超出其使用寿命。我在这里没有使用Session,虽然它远非理想 - 我已经看到类似的错误引入了来自对象的反向引用,其长度也比Page life更长。