1

一旦我尝试写入日志文件,我的本地测试服务器就会崩溃。我将它用于 ASP.NET 页面,代码隐藏是 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();
}

因此,当我打开页面时,会写入日志,但随后服务器崩溃。所以我认为问题出在描述符的某个地方,但我不知道为什么......

4

5 回答 5

3

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

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

您可以将清理代码放在 Unload 事件中,请参阅ASP.NET 页面生命周期

于 2009-11-19T10:41:57.417 回答
1

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

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

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

于 2009-11-19T10:36:34.497 回答
1

首先:您不需要同时调用 close 和 dispose。请参阅 MSDN 中的链接: 链接文本

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

您必须调用 Close 以确保所有数据都正确写入底层流。在调用 Close 之后,StreamWriter 上的任何操作都可能引发异常。如果磁盘空间不足,调用 Close 会引发异常。

于 2009-11-19T10:41:59.210 回答
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));
}

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

另见以下两篇:
第 1
条 第 2 条

于 2009-11-19T11:09:06.223 回答
0

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

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

我宁愿让类继承自 IDisposable 并将清理代码放在那里。使用处置模式:这里

于 2009-11-19T10:54:44.803 回答