Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重复读取小文件会抛出内存_C#_File - Fatal编程技术网

C# 重复读取小文件会抛出内存

C# 重复读取小文件会抛出内存,c#,file,C#,File,我有两个程序一起工作。为了协调它们的操作,我使用了一个小的设置文件。此设置文件包含由“;”分隔的两个单词。因此,在一个程序中,我使用while循环重复读取文件中的单词。我说的重复是指每秒一次。循环仅在程序终止时终止;当用户关闭电脑时 但随着循环的每次迭代,内存中的程序大小都会增加,直到程序抛出OutOfMemory异常。我尝试了两种不同的读取文件的方法,但都会导致程序在内存中“增长” FileStream FS = new FileStream("br.stat", FileMode.Open)

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

但随着循环的每次迭代,内存中的程序大小都会增加,直到程序抛出OutOfMemory异常。我尝试了两种不同的读取文件的方法,但都会导致程序在内存中“增长”

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。