如何修复此System.OutOfMemoryException错误?

时间:2014-02-01 01:50:44

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

所以,我开始使用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;
        }
    }
}

只需注意一些事项,这些事件#.Something每个都与一个数字按钮相关联,所以使用Enter7.Click,点击标有7的按钮,它会做一些事情。最后,Result.Text与显示结果的Label相关联。现在,我只是希望能够看到每个按钮点击的结果,但我计划为第二个数字和数学函数添加函数,如指数和平方根。

我该怎样做才能解决此错误?

2 个答案:

答案 0 :(得分:3)

首先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以帮助客户端。

答案 1 :(得分:3)

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

转储循环。不应该有任何需要。确保您的结果也转到asp中的输入字段,这样当按下另一个按钮时,您可以将数字“添加”到您已经建立的数字。

相关问题