【问题标题】:Would base.OnLoad() cause an infinite loop if called in page_load event?如果在 page_load 事件中调用 base.OnLoad() 会导致无限循环吗?
【发布时间】:2011-09-07 19:56:35
【问题描述】:

我团队的一名成员浏览了我们的 ASP.NET Web 应用程序中的几个页面,并将一些 OnLoad 覆盖更改为 page_load 事件,但他没有删除对 base.OnLoad() 的调用。

这个:

Public void override OnLoad()
{
    //stuff
    base.OnLoad();
}

到这里:

Public void Page_Load(object sender, EventArgs e)
{
    //stuff
    base.OnLoad();
}

注意:如果有语法错误,我很抱歉,我不在有实际源代码的计算机上。

当我们将代码推送到实时服务器时,我们开始遇到 IIS app_pool 每 45 分钟到 1 小时崩溃一次的问题。我们仍然不完全确定这是问题所在,但我很好奇 page_load 事件是从哪里调用的。它们是否从 system.web.ui.page 中的 OnLoad 方法调用?如果是这样,那么我认为这会导致无限循环并最终耗尽内存并导致 app_pool 崩溃。

这可能是我们麻烦的原因吗?

【问题讨论】:

  • 当然,如果它是无限循环打开页面会导致堆栈溢出,你会马上知道。
  • 我知道我们不需要它。我只是好奇这是否会导致应用程序池崩溃。

标签: c# .net asp.net webforms page-lifecycle


【解决方案1】:

base.OnLoad(); 导致引发 Load 事件。这将导致您的页面的OnLoad 事件处理程序被引发,其中再次包含对OnLoad 的调用。您发布的代码确实不正确。

MSDN 上的 ASP.NET Page Life Cycle Overview 文章非常适合解释页面加载和其他事件的工作原理。

【讨论】:

    【解决方案2】:

    即使它不会导致无限循环,从覆盖基本虚拟方法到处理事件的决定也不是明智的决定。我建议您覆盖,而不是担心无限循环。它让您担心的事实表明,覆盖是更好的选择。

    请阅读 Bill Wagner 的 Effective C# 中的 第 30 条:优先覆盖事件处理程序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-01
      • 2011-08-23
      • 2017-12-24
      • 2015-05-20
      • 2017-06-10
      • 1970-01-01
      • 2015-01-16
      • 2012-04-28
      相关资源
      最近更新 更多