【问题标题】:How can I fix this System.OutOfMemoryException error?如何修复此 System.OutOfMemoryException 错误?
【发布时间】:2014-02-01 01:50:44
【问题描述】:

所以,我开始使用 ASP.NET,同时学习一点 C#,足以通过制作网页来获得。我刚刚接手了制作一个基本的视觉计算器的项目,这种计算器带有你点击的精美按钮。这是我的 C# 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class ExtraCredit_GraphicCalculator : System.Web.UI.Page
{
    string number1 = "";
    string number2 = "";
    bool EnteringNumber1 = true;
    bool EnteringNumber2 = false;
    protected void Page_Load(object sender, EventArgs e)
    {
        while (EnteringNumber1)
        {

            Enter9.Click += (s, args) =>
            {
                number1 = number1 + "9";
            };

            Enter8.Click += (s, args) =>
            {
                number1 = number1 + "8";
            };
            Enter7.Click += (s, args) =>
            {
                number1 = number1 + "7";
            };
            Enter6.Click += (s, args) =>
            {
                number1 = number1 + "6";
            };
            Enter5.Click += (s, args) =>
            {
                number1 = number1 + "5";
            };
            Enter4.Click += (s, args) =>
            {
                number1 = number1 + "4";
            };
            Enter3.Click += (s, args) =>
            {
                number1 = number1 + "3";
            };
            Enter2.Click += (s, args) =>
            {
                number1 = number1 + "2";
            };
            Enter1.Click += (s, args) =>
            {
                number1 = number1 + "1";
            };
            Enter0.Click += (s, args) =>
            {
                number1 = number1 + "0";
            };
            Result.Text = number1;
        }
    }
}

只需注意几件事,这些 Event#.Something 每个都与一个数字按钮相关,因此使用 Enter7.Click,在单击标记为 7 的按钮时,它会执行一些操作。最后,Result.Text 与显示结果的标签相关联。现在,我只想看到每个按钮单击的结果,但我计划添加第二个数字的函数以及指数和平方根等数学函数。

我能做些什么来修复这个错误?

【问题讨论】:

  • 你想用while 循环做什么?因为目前您的代码设计为在无限循环中注册事件处理程序,直到程序崩溃......
  • 好的,我看到了 while 循环错误。它的重点是让用户输入任意数量的数字,它的结尾是单击的操作数按钮(我没有到达)。

标签: c# asp.net memory-management out-of-memory


【解决方案1】:

我看到的一个大错误是您从未将 EnteringNumber1 设置为 false,因此在页面加载时您有一个无限循环,并且在该无限循环中您正在为您的按钮重复注册事件处理程序,这会不断分配内存。

转储循环。应该没有必要。确保您的结果也进入您的 asp 中的输入字段,以便在按下另一个按钮时,您可以将数字“添加”到您已经建立的数字中。

【讨论】:

    【解决方案2】:

    首先EnteringNumber1 始终为真,因此您的Page_Load 方法永远不会退出。它只会继续添加可能导致您的内存错误的事件处理程序。知道Page_Load 是在页面初始化部分触发的事件。您通常会使用此方法在控件中设置属性并建立数据库连接(有关详细信息,请参阅Page Life Cycle Overview)。

    记住 HTML 是静态的,asp.net 所做的只是在服务器上创建这些静态 html 页面。您需要移除无限循环并让事件注册一次。

    您还需要处理点击事件中值的某种显示。

    在这种情况下,我真的看不到您的Page_Load 处理程序发生了太多事情。如果需要,您可以为每个按钮创建单独的事件处理程序(您可以稍后简化)。默认情况下,当用户单击页面上的按钮时,会向服务器发送 PostBack,服务器会进行一些计算并返回新版本的页面。最后,你会得到类似下面的东西:

    protected void Page_Load(object sender, EventArgs e)
    {
         if(!Page.IsPostBack()) // we only want this stuff to happen on initial load        
         {
             hiddenField.value = 0; 
         }
    }
    
    protected void Enter9_OnClick(object sender, EventArgs e)
    {
        // a postback to the server just happened
        hiddenField.value = (double)hiddenField.value + 9;
    }
    
    ....
    ....
    

    请注意,此代码未经测试,可能不是 100% 正确,但它让您了解 asp.net 的工作原理。

    现在,当您对页面生命周期感到满意时,您真正想要做的是 a) 在 javascript 中处理客户端计算或 b) 将客户端代码的调用编组到服务器 (您的计算将在哪里发生)并使用简单的ajax返回。查看jQuery 以帮助客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-22
      • 2014-03-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多