C# 重复读取小文件会抛出内存
我有两个程序一起工作。为了协调它们的操作,我使用了一个小的设置文件。此设置文件包含由“;”分隔的两个单词。因此,在一个程序中,我使用while循环重复读取文件中的单词。我说的重复是指每秒一次。循环仅在程序终止时终止;当用户关闭电脑时 但随着循环的每次迭代,内存中的程序大小都会增加,直到程序抛出OutOfMemory异常。我尝试了两种不同的读取文件的方法,但都会导致程序在内存中“增长”C# 重复读取小文件会抛出内存,c#,file,C#,File,我有两个程序一起工作。为了协调它们的操作,我使用了一个小的设置文件。此设置文件包含由“;”分隔的两个单词。因此,在一个程序中,我使用while循环重复读取文件中的单词。我说的重复是指每秒一次。循环仅在程序终止时终止;当用户关闭电脑时 但随着循环的每次迭代,内存中的程序大小都会增加,直到程序抛出OutOfMemory异常。我尝试了两种不同的读取文件的方法,但都会导致程序在内存中“增长” FileStream FS = new FileStream("br.stat", FileMode.Open)
FileStream FS = new FileStream("br.stat", FileMode.Open);
StreamReader SR = new StreamReader(FS);
string s = SR.ReadToEnd();
FS.Dispose();
SR.Dispose();
及
有没有一种方法可以重复读取文件而不发生这种情况
谢谢。我建议您使用 文件和字体是访问非托管文件的托管类型的示例 资源(在本例中为文件句柄和设备上下文)。有 许多其他类型的非托管资源和类库类型 封装它们。所有这些类型都必须实现IDisposable 接口 通常,当您使用IDisposable对象时,应该声明和 在using语句中实例化它。using语句调用 以正确的方式在对象上处置方法,以及(当您使用它时 如前所示),它还会导致对象本身超出范围 只要调用Dispose。在使用块中,对象是 只读,无法修改或重新分配 大概是
using (FileStream FS = new FileStream("br.stat", FileMode.Open))
using (StreamReader SR = new StreamReader(FS))
{
string s = SR.ReadToEnd();
}
我建议你使用 文件和字体是访问非托管文件的托管类型的示例 资源(在本例中为文件句柄和设备上下文)。有 许多其他类型的非托管资源和类库类型 封装它们。所有这些类型都必须实现IDisposable 接口 通常,当您使用IDisposable对象时,应该声明和 在using语句中实例化它。using语句调用 以正确的方式在对象上处置方法,以及(当您使用它时 如前所示),它还会导致对象本身超出范围 只要调用Dispose。在使用块中,对象是 只读,无法修改或重新分配 大概是
using (FileStream FS = new FileStream("br.stat", FileMode.Open))
using (StreamReader SR = new StreamReader(FS))
{
string s = SR.ReadToEnd();
}
问题在于设计,而不是实现。你只需要在应用程序启动时读取一次文件,然后在文件更改时再次读取。您可以使用检测对文件的更改并重新加载设置 与无限期读取文件相比,这使用的资源要少得多
此外,您还需要利用
使用
关键字来确保正确处理文件流和读取器。事实上,我会简化并只使用File.ReadAllText(filename)
问题在于设计,而不是实现。你只需要在应用程序启动时读取一次文件,然后在文件更改时再次读取。您可以使用检测对文件的更改并重新加载设置
与无限期读取文件相比,这使用的资源要少得多
此外,您还需要利用
使用
关键字来确保正确处理文件流和读取器。事实上,我会简化并只使用File.ReadAllText(filename)
我认为你做得不对。实际上,不需要每次迭代都读取文件,除非它被更改
相反,最好使用FileSystemWatcher读取值并更改控件值
您还应该使用以下方法来避免内存泄漏问题
using (var FS = new FileStream("br.stat", FileMode.Open))
{
using (var SR = new StreamReader(FS))
{
var s = SR.ReadToEnd();
}
}
我认为你做错了。实际上,不需要每次迭代都读取文件,除非它被更改 相反,最好使用FileSystemWatcher读取值并更改控件值 您还应该使用以下方法来避免内存泄漏问题
using (var FS = new FileStream("br.stat", FileMode.Open))
{
using (var SR = new StreamReader(FS))
{
var s = SR.ReadToEnd();
}
}
您确定这些线路导致了异常吗?如果您想在两个应用程序之间进行通信,套接字可能更有效,那么您可以在信息可用时发送信息,不依赖文件系统。您确定这些行导致了异常吗?如果您想在两个应用程序之间进行通信,套接字可能更有效,那么您可以在信息可用时发送信息,而不是依赖文件系统。如果OP使用file.ReadAllText方法,这可能无法解决问题。OP确实指定了它是一个小文本文件。我使用的是using语句。它仍然导致了尺寸的增加。我使用Dispose()只是想看看它是否能解决问题。如果OP使用File.ReadAllText方法,这可能无法解决问题。OP确实指定了它是一个小文本文件。我使用的是using语句。它仍然导致了尺寸的增加。我使用Dispose()只是想看看它是否能解决问题。我同时编写的内容非常详细。谢谢我现在使用FileSystemWatcher。我同时编写的内容非常详细。谢谢我现在使用FileSystemWatcher。