何时调用File.Dispose()

Har*_*art 1 c# dispose file textwriter

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

TextWriter writer = File.CreateText(@"...txt");
writer.Write("Hello World");
Run Code Online (Sandbox Code Playgroud)

但是,这样做:

TextWriter writer = File.CreateText(@"...txt");
writer.Write("Hello World");
writer.Dispose();
Run Code Online (Sandbox Code Playgroud)

这是为什么?这个额外的行告诉程序做什么不同?我不想关闭TextWriter,因为它将编写日志,这些日志在我的应用程序运行时不断且无限期地运行.

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

UPDATE

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

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

但是如果我只是将它包含在using语句中,则不会写入日志,因为在它们准备好写入时,将执行using语句并释放TextWriter.

谢谢

AAA*_*ddd 5

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

在不关闭或处理文件的情况下,您将离开非托管资源并可能锁定文件,更不用说内存泄漏了.而是始终使用using声明

using (TextWriter writer = File.CreateText(@"...txt"))
{
   writer.Write("Hello World");
}
Run Code Online (Sandbox Code Playgroud)

但是,如果要继续写入文件,则必须刷新它

FileStream.Flush方法

清除此流的缓冲区并使任何缓冲的数据写入该文件.

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

简而言之,大多数流都由内部数组(缓冲区)支持,所以你不要破坏写入.默认大小为4k,当它达到缓冲区大小时,它会自动刷新.如果你想看到立即写入,你必须每次刷新它

最后,一些流具有自动刷新功能,可以为您完成此任务

自动刷新

获取或设置一个值,该值指示在每次调用Write(Char)后StreamWriter是否将其缓冲区刷新到基础流

当你完成流总是处理它