2009-11-19 85 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