2012-05-28 69 views
0

我打算使用共享变量来实现日志记录工具。看看下面的代码:错误处理程序的ASP.NET共享变量

Imports System.IO 

Public Class TestClass 

    Public Shared objError As New StreamWriter("C:\Test.txt") 

End Class 

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Try 
      TestClass.objError.WriteLine("Error 1") 
      TestClass.objError.WriteLine("Error 2") 
      TestClass.objError.WriteLine("Error 3") 
      'TestClass.objError.Close() 
      TestClass.objError.WriteLine("Error 4") 
      TestClass.objError = Nothing 
     Catch ex As Exception 

     End Try 
    End Sub 

我不知道如何创建这个共享变量和销毁(我假设它是在Form_Load之前创建并由form_unload破坏)。我也不明白为什么可以将对静态变量的引用设置为Nothing;这个变量应该存在,直到程序结束? (Q1,第1部分)我意识到这是一个简单的问题。

有更好的方法来实现日志记录机制吗? (Q1第2部分)。日志记录机制写入错误和日志条目。

UPDATE 我想我在这里找到了我的答案:http://msdn.microsoft.com/en-us/library/z2cty7t8.aspx。 “一个静态变量继续存在并保留其最新值,下一次您的代码调用该过程时,该变量不会重新初始化,并且它仍保留您分配给它的最新值。在其中定义的类或模块的生命周期。“

我不相信这是创建日志工具的最佳方式。因此,我的问题的第2部分仍然是开放的。

回答

2

你为可变Public Shared objError保留的内存区域和创建并分配给该区域As New StreamWriter("C:\Test.txt").

在声明变量objError对象的实例之间的混淆,编译器保留所需的内存,但没有填充有效值(对象的一个​​实例)。
新的命令,该命令用StreamWriter的对象实例初始化此区域。

当您将值分配给变量Nothing您正在清除StreamWriter的实例(实际上我更喜欢直接调用Flush和Close),但是您并未删除为Shared变量保留的内存区域。

关于日志。你问'哪个是最好的方法',那么最好的方法就是按照你的建议使用外部组件。创建更好的日志记录系统将非常困难,log4net已经过尝试和测试,它是免费的,它被认为是最好的。

+0

谢谢。现在很清楚+1。在我回答之前还有一个问题;第一次调用StreamWriter.WriteLine之后;文件被锁定(如果没有使用共享变量)。有没有办法在不关闭StreamWriter的情况下释放文件锁? – w0051977

+0

你可以[在这里看看MSDN](http://msdn.microsoft.com/en-us/library/5h0z48dh.aspx)FileStream上允许控制锁定的文档。但是,请记住,如果写入后未关闭流,则如果程序崩溃,则可能会丢失信息。 (告别记录数据)。 – Steve

+0

是的,似乎关键是将FileStream传递给StreamWriter。 FileStream可以共享。 – w0051977

1

作为对第2部分的回答,我建议您使用log4net或任何其他日志框架。您也可以通过ASP.NET Health Monitoring捕获错误。但是,它不是一个普通的日志设施。

+0

如果可能,我宁愿避免使用第三方工具。 – w0051977

+0

已被更新回答。不过,我会考虑使用第三方记录工具。取决于你的要求我想。 –

+0

谢谢。经过进一步思考。我将考虑这一点。 +1。 – w0051977