ASP.NET-Page(C#)导致服务器崩溃

时间:2009-11-19 10:29:18

标签: c# asp.net file destructor

当我尝试写入日志文件时,我的本地测试服务器崩溃了。我将它用于ASP.NET-Page,代码隐藏是C#。

结构:

/
 Functions.cs
 index.aspx
 index.aspx.cs

我在Functions加载时创建index.aspx的实例。在Functions中,我定义了一个日志记录函数,该函数从index.aspx.cs调用,如下所示:

if (_WriterOpen == false)
{
    _Writer = new StreamWriter(_WorkingDir + _Logfile, true);
    _WriterOpen = true;
    _Writer.AutoFlush = true;
}
_Writer.WriteLine(DateTime.Now.ToString() + ": " + String.Format(Note, Args));

_Writer是为Class全局定义的,如您所见,包含StreamWriter。该类本身有一个析构函数来关闭与文件的任何连接;

~Functions()
{
    _Writer.Flush();
    _Writer.Close();
    _Writer.Dispose();
}

因此,当我打开页面时,会写入日志,但服务器崩溃。所以我认为问题出在descructor的某个地方,但我无法弄清楚为什么......

5 个答案:

答案 0 :(得分:3)

您不需要任何析构函数,StreamWriter已经拥有它。

您不应该从析构函数访问其他对象,因为它将由垃圾收集器调用,其他对象处于不可确定的状态。你不知道它什么时候被调用,你不知道它将被调用到哪个线程。 从来没有,永远不要写一个析构函数,这几乎总是一个坏主意。

您可以将清理代码放在卸载事件中,请参阅ASP.NET Page Life Cycle

答案 1 :(得分:1)

这听起来很可能是由递归调用引起的堆栈溢出错误。

您是否正在记录错误,即导致错误,即记录,导致......等等。

可以从Visual Studio以调试模式运行吗?

答案 2 :(得分:1)

首先:你不需要同时调用close和dispose。 请参阅MSDN中的链接: link text

  

Close的这个实现调用Dispose方法传递一个真值。

     

您必须致电关闭以确保全部   数据被正确写出来了   潜在的流。打电话给   关闭,任何操作   StreamWriter可能会引发异常。   如果没有足够的空间   磁盘,调用Close会引发一个   异常。

答案 3 :(得分:1)

我建议自动调用dispose调用的using语句。为了您的目的,代码看起来像:

StreamWriter _Writer;

using(_Writer)
{
    if (_WriterOpen == false)
    {
       _Writer = new StreamWriter(_WorkingDir + _Logfile, true);
       _WriterOpen = true;
       _Writer.AutoFlush = true;
    }
    _Writer.WriteLine(DateTime.Now.ToString() + ": " + String.Format(Note, Args));
}

注意我没有测试过,但它应该工作(或至少接近)。如果需要,我会在检查后更新

另见以下两篇文章:
Article 1
Article 2

答案 4 :(得分:0)

如果您无法在调试器中运行它,请尝试从函数中注释掉行,直到它停止翻倒为止。这应该给你一个线索。

垃圾收集器会在某个不确定的时间调用析构函数,所以如果你经常崩溃,它可能不是析构函数。

我更希望让类继承自IDisposable并将清理代码放在那里。使用配置模式:here