0

我有两个程序可以一起工作。为了协调他们的操作,我使用了一个小的设置文件。此设置文件包含两个由“;”分隔的单词。因此,在一个程序中,我使用 while 循环反复读取文件中的单词。反复是指每秒一次。循环仅在程序终止时终止;当用户关闭电脑时。

但是随着循环的每次迭代,内存中的程序大小都会增加,直到程序抛出 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");

有没有办法重复读取文件而不会发生这种情况?

谢谢。

4

3 回答 3

2

问题在于设计,而不是实施。您只需在应用程序启动时读取文件一次,并在文件更改时再次读取。您可以使用FileSystemWatcher检测对文件的更改并重新加载设置。

与无限期地读取文件相比,这使用的资源要少得多。

此外,您还需要利用using关键字来确保正确处理文件流和阅读器。事实上,我会简化并只使用File.ReadAllText(filename).

于 2013-08-28T11:41:31.433 回答
1

我认为你做错了。实际上,除非文件被更改,否则每次迭代都不需要读取文件。

相反,最好使用 FileSystemWatcher http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.changed(v=vs.85).aspx来读取值并更改您的控制值.

您还应该使用以下方法来规避内存泄漏问题

using (var FS = new FileStream("br.stat", FileMode.Open))
{
    using (var SR = new StreamReader(FS))
    {
        var s = SR.ReadToEnd();
    }
}
于 2013-08-28T11:43:22.403 回答
0

我建议你看看使用using 语句

File 和 Font 是访问非托管资源(在本例中为文件句柄和设备上下文)的托管类型的示例。还有许多其他类型的非托管资源和封装它们的类库类型。所有此类类型都必须实现 IDisposable 接口。

通常,当您使用 IDisposable 对象时,您应该在 using 语句中声明和实例化它。using 语句以正确的方式调用对象的 Dispose 方法,并且(当您如前所示使用它时)它还会导致对象本身在调用 Dispose 时立即超出范围。在 using 块中,对象是只读的,不能修改或重新分配。

所以像

using (FileStream FS = new FileStream("br.stat", FileMode.Open))
using (StreamReader SR = new StreamReader(FS))
{
    string s = SR.ReadToEnd();
}
于 2013-08-28T11:41:25.647 回答