2009-11-19 61 views
1

我试图写入日志文件时,本地测试服务器崩溃。我正在使用这个ASP.NET页面,代码隐藏是C#。由于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是全局定义的类和包含,如你所见,一个StreamWriter。该类本身具有析构函数来关闭与文件的所有连接;

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

所以,当我打开我的页面时,日志被写入,但然后服务器崩溃。所以我想这个问题是某处descructor,但我想不通为什么...

+0

你什么错误消息:如果需要检查出来

另请参阅以下两篇文章之后我会及时更新? – 2009-11-19 10:30:07

+0

无,它只是与“发送报告”对话框崩溃。我尝试在脚本中捕捉任何期望,但是捕捉部分甚至没有被调用...... – 2009-11-19 10:33:01

+1

备注:我认为您不应该保持打开日志文件的句柄,而是每次写入时都打开并关闭它一条线。我认为性能成本可以忽略不计。 – 2009-11-19 10:34:39

回答

1

我推荐using语句,它会自动调用dispose调用。你的目的的代码看起来是这样的:

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

+0

这是一个好主意。事情是,到现在为止,我到达了Visual-C#-Book * gg *的“using” - 声明章节, – 2009-11-19 12:25:13

1

这听起来最有可能是一个堆栈溢出错误,造成了递归调用。

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

你可以在Visual Studio的调试模式下运行它吗?

+0

没有给出堆栈溢出,因为我根本没有记录错误,但在页面计算过程中发送了重要的消息。这可以说是不是一个错误日志,而是一个“看看我做了什么” - 日志。 – 2009-11-19 10:38:36

3

你不需要任何析构函数,StreamWriter已经拥有了它自己的。

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

您可以将您的清理代码在Unload事件,看ASP.NET Page Life Cycle

+0

噢,这是新的......好吧,我这样做是因为我有时会得到一个错误,指出我无法写入文件,因为它正在被另一个进程使用,所以我决定手动关闭它。 – 2009-11-19 10:44:18

+0

好的,所以我不再使用它,并在我写了一个便条之后阻止了Writer。工作正常,性能应该没问题。 – 2009-11-19 10:49:32

1

第一:你不需要调用close和dispose。 从MSDN见链接: link text

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

您必须致电Close以确保所有 数据正确写出到 基础数据流中。在致电 关闭之后,对于 StreamWriter的任何操作都可能引发异常。 如果 磁盘上没有足够的空间,则调用Close会引发 异常。

+0

好的,谢谢。只是想确保;-) – 2009-11-19 10:43:35

0

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

垃圾收集器将调用析构函数在某个不确定的时间,因此,如果你得到一个经常性的死机,它可能不是析构函数。

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