2011-07-04 34 views
1

在我的節目我使用如何捕捉程序關閉以釋放資源?

logWriter = File.CreateText(logFileName); 

存儲日誌。

我應該調用logWriter.Close()和在哪裏?應該是finalizer什麼的?

+2

你應該總是關閉文件的句柄,理想情況下,一旦你完成寫入或程序退出?如果您正在使用此功能來記錄錯誤,則應確保在發生錯誤/異常時它已正確關閉。 –

回答

1

是的,你應該關閉你的文件,當你完成它。您可以創建一個日誌類(或使用現有的類如log4net)並實現IDisposable,並在Dispose - 方法釋放資源。

你可以用using -block包裝它,但我寧願讓它在一個單獨的類中。這種方式在未來可以處理更多的高級日誌記錄,例如,當您的應用程序在多個線程上運行並且您嘗試同時寫入文件時會發生什麼情況?

log4net可以配置爲使用text-file or a database,如果應用程序增長,它很容易更改。

3

的一般做法是在using聲明

using (var logWriter = File.CreateText(logFileName)) 
{ 
    //do stuff with logWriter 
} 

但是包裹File.CreateText,如果你想logWriter住了您的應用程序的時間,因爲你很可能不希望using聲明,這是不方便包裹你的應用程序的Main方法。

在這種情況下,您必須確保您在應用程序終止前致電DisposelogWriter,這正是using在幕後做的。

0

如果您有一個希望保持打開的日誌文件,那麼操作系統將在應用程序退出時關閉該進程的一部分時釋放該文件。你實際上並不需要明確地進行管理。

讓操作系統清理文件句柄的一個問題是您的文件編寫器將使用緩衝區,並且在它將寫出其緩衝區的剩餘部分之前可能需要刷新。如果你不打電話關閉\處理它,你可能會失去信息。強制沖洗的方法之一是鉤,當你的.Net進程關閉後調用的AppDomain卸載事件,如:

AppDomain.CurrentDomain.DomainUnload += delegate { logWriter.Dispose(); }; 

有在域中卸載事件處理程序,可能會發生什麼樣的時間限制,但寫入文件寫入器緩衝區的遺留物就在此範圍之內。我假設你有一個默認設置,即一個默認的AppDomain,否則事情變得棘手,包括日誌。

如果要保持文件處於打開狀態,請考慮使用訪問權限打開它,以便其他進程具有讀取訪問權限。這樣可以在程序運行時使用文件尾標或文本編輯器等程序來讀取文件。