2013-08-28 48 views
0

我有兩個程序一起工作。爲了協調他們的操作,我使用一個小的設置文件。該設置文件包含兩個由';'分隔的單詞。所以在一個程序中,我使用while循環重複讀取文件中的單詞。我反覆說每秒一次。循環僅在程序終止時終止;當用戶關閉電腦。反覆讀取小文件拋出OutOfMemory

但隨着循環的每次迭代,內存中的程序大小都會增加,直到程序拋出OutOfMemory異常。我嘗試了兩種不同的方法來讀取文件,但都導致程序在內存中「增長」。

FileStream FS = new FileStream("br.stat", FileMode.Open); 
StreamReader SR = new StreamReader(FS); 
string s = SR.ReadToEnd(); 
FS.Dispose(); 
SR.Dispose(); 

string S = File.ReadAllText("br.stat"); 

有沒有辦法與反覆讀取文件了這種情況的發生?

謝謝。

+0

你確定這些線是造成異常? – Patrick

+0

如果您想在兩個應用程序之間進行通信,Socket可能會更有效率,那麼您可以在可用時發送信息,而不是依賴文件系統。 – Patrick

回答

0

我會建議你看一下使用using statement

文件和字體是訪問非託管資源 (在這種情況下,文件句柄和設備上下文)託管類型的實例。有 許多其他種類的非託管資源和 封裝它們的類庫類型。所有這些類型都必須實現IDisposable 接口。

通常,當您使用IDisposable對象時,您應聲明並在使用語句中將其實例化爲。 using語句以正確的方式在對象上調用 Dispose方法,並且(如前所示使用 時)也會在調用Dispose後立即超出範圍 。在使用塊中,對象是 只讀,不能被修改或重新分配。

所以像

using (FileStream FS = new FileStream("br.stat", FileMode.Open)) 
using (StreamReader SR = new StreamReader(FS)) 
{ 
    string s = SR.ReadToEnd(); 
} 
+0

雖然如果OP使用File.ReadAllText方法,但這可能無法解決問題。 – Patrick

+0

OP確實指出它是一個小文本文件。 –

+0

我正在使用using語句。它仍然導致規模的增加。我使用Dispose()來查看它是否不能解決問題。 –

2

問題是設計,遠遠超過實施。您只需在應用程序啓動時從文件讀取一次,並在文件更改時再次讀取。您可以使用FileSystemWatcher來檢測文件的更改並重新加載設置。

這比使用無限期讀取文件的資源大大減少。

此外,您還需要利用關鍵字using來確保正確處理文件流和閱讀器。事實上,我會簡化並使用File.ReadAllText(filename)

+0

對於我在同一時間寫的東西幾乎是逐字的。 – Mauro

+0

謝謝我現在使用FileSystemWatcher。 –

相關問題