2012-05-28 65 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