何时调用 File.Dispose()

When to call File.Dispose()

我正在尝试使用文本编写器将文本写入 .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 已被释放。

谢谢

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

如果不关闭或处置文件,您将留下非托管资源并可能锁定文件,更不用说内存泄漏了。而是始终使用 using 语句

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

但是如果你想连续写入文件,你将不得不刷新它

FileStream.Flush Method

Clears buffers for this stream and causes any buffered data to be written to the file.

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

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

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

AutoFlush

Gets or sets a value indicating whether the StreamWriter will flush its buffer to the underlying stream after every call to Write(Char)

当你完成流后 总是 处理它