在向浏览器写入太多时,防止出现内存不足错误

时间:2014-04-28 14:04:05

标签: c# asp.net

我被分配了解决问题的任务,我怀疑有太多数据试图写入浏览器。 I.e构建表以显示2,000多条记录。

$exception  {"Exception of type 'System.OutOfMemoryException' was thrown."} System.Exception {System.OutOfMemoryException}

Page_PreRender

引发异常

解决问题的最简单方法是什么?

测试/解决它的最简单方法是什么?

由于

[OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.]
   System.String.Concat(String str0, String str1, String str2, String str3) +76
   ProgramName.File.GetData() in C:\inetpub\wwwroot\ProgramName\File.aspx.cs:137
   ProgramName.File.Page_PreRender(Object sender, EventArgs e) in C:\inetpub\wwwroot\ProgramName\File.aspx.cs:18
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
   System.Web.UI.Control.OnPreRender(EventArgs e) +8775110
   System.Web.UI.Control.PreRenderRecursiveInternal() +80
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +842

1 个答案:

答案 0 :(得分:5)

通过堆栈跟踪,我想我知道你的问题。

在你的Page_PreRender方法中,你正在连接字符串(你提到你正在构建一个表 - 它可能是代码执行此操作)。

如果将两个字符串连接在一起,则会分配内存以创建一个新字符串来保存结果,但是存储前两个字符串的内存不会被回收,因为这些字符串仍然在范围内。我猜你正在连接一个 lot 字符串(在循环中),因此内存不足。

修复方法是使用StringBuilder

找到类似这样的代码:

public void GetData() 
{
    string myTableString = "";
    foreach (var row in MyRows)
    {
        myTableString += "<tr><td>" + row.someProperty + "</td></tr>"
    }

以下

using System.Text // This goes at the top of the file, with the other using statements.
...

public void GetData() 
{
    StringBuilder sb = new StringBuilder();
    foreach (var row in MyRows)
    {
        sb.Append("<tr><td>" + row.someProperty + "</td></tr>");
    }
    string myTableString = sb.ToString();

请注意,我上面给出的代码只是我对代码的最佳猜测 - 如果您发布代码会更容易!!