当我尝试写入日志文件时,我的本地测试服务器崩溃了。我将它用于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的某个地方,但我无法弄清楚为什么......
答案 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));
}
注意我没有测试过,但它应该工作(或至少接近)。如果需要,我会在检查后更新
答案 4 :(得分:0)
如果您无法在调试器中运行它,请尝试从函数中注释掉行,直到它停止翻倒为止。这应该给你一个线索。
垃圾收集器会在某个不确定的时间调用析构函数,所以如果你经常崩溃,它可能不是析构函数。
我更希望让类继承自IDisposable并将清理代码放在那里。使用配置模式:here