反复读取小文件会抛出OutOfMemory

时间:2013-08-28 11:37:24

标签: c# file

我有两个一起工作的程序。为了协调他们的操作,我使用一个小的设置文件。此设置文件包含由';'分隔的两个单词。所以在一个程序中,我使用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");

有没有办法在没有发生这种情况的情况下重复读取文件?

感谢。

3 个答案:

答案 0 :(得分:2)

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

这比使用无限期读取文件的资源少得多。

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

答案 1 :(得分: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();
    }
}

答案 2 :(得分:0)

我建议您使用using statement

  

文件和字体是访问非托管的托管类型的示例   资源(在这种情况下是文件句柄和设备上下文)。有   许多其他类型的非托管资源和类库类型   封装它们。所有这些类型都必须实现IDisposable   接口

     

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

类似

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