何时调用File.Dispose()

时间:2019-01-03 04:36:48

标签: c# file dispose textwriter

我正在尝试使用文本编写器将文本写入.NET Core中的文件。以下代码不会向文件输出任何内容:

TextWriter writer = File.CreateText(@"...txt");
writer.Write("Hello World");

但是,这样做:

TextWriter writer = File.CreateText(@"...txt");
writer.Write("Hello World");
writer.Dispose();

那是为什么?那多余的行告诉程序如何做不同的事情?我不想关闭TextWriter,因为它将要编写日志,这些日志在我的应用程序运行时会持续不断地运行。

如何在应用程序停止运行之前将其保持打开状态?

更新

所以我要这样做的原因是,我正在使用将其日志写入TextWriter的SDK:

TextWriterLogger(textWriter);
//Creates a logger that writes to a TextWriter. User is responsible for providing an instance of TextWriter that is thread safe.

但是,如果我仅将其包含在using语句中,则不会写入日志,因为在准备好编写日志时,using语句将已执行,并且TextWriter会被处理。

谢谢

1 个答案:

答案 0 :(得分:5)

Dispose调用Flush,它将存储在缓冲区中的内部字节写入磁盘

如果不关闭或处理文件,则会留下不受管理的资源,并且可能会锁定文件,更不用说内存泄漏了。而是始终使用using语句

using (TextWriter writer = File.CreateText(@"...txt"))
{
   writer.Write("Hello World");
}

但是,如果要连续写入文件,则必须将其刷新

FileStream.Flush Method

  

清除此流的缓冲区,并使所有缓冲的数据   写入文件。

TextWriter writer = File.CreateText(@"...txt");
...
writer.Write("Hello World");
...
writer.Flush(); // at this point the bytes are flushed to disk
...
...
writer.Dispose();

简而言之,大多数流都由内部数组(缓冲区)支持,因此您不必担心写入。默认大小为4k,当达到缓冲区大小时,它将自动刷新。如果您想立即看到写入内容,则必须每次

最后一些流具有自动刷新功能,可以为您完成这项工作

AutoFlush

  

获取或设置一个值,该值指示StreamWriter是否将刷新   每次调用Write(Char)

后,将其缓冲区缓冲到基础流

当您完成流处理后始终处理