我有两个一起工作的程序。为了协调他们的操作,我使用一个小的设置文件。此设置文件包含由';'分隔的两个单词。所以在一个程序中,我使用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");
有没有办法在没有发生这种情况的情况下重复读取文件?
感谢。
答案 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();
}