Когда вызывать File.Dispose () - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь использовать средство записи текста для записи текста в файл в .NET Core. Приведенный ниже код ничего не выводит в файл:

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

Однако это так:

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

Почему это? Что эта дополнительная строка говорит программе делать по-другому? Я не хочу закрывать 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.

Но если я просто включу это в оператор using, журналы не будут записываться, потому что к тому времени, когда они будут готовы к записи, оператор using будет выполнен, и TextWriter будет удален.

Спасибо

1 Ответ

0 голосов
/ 03 января 2019

Dispose вызывает Flush, который записывает внутренние байты, хранящиеся в буфере, на диск

Не закрывая или не удаляя файл, вы оставляете неуправляемые ресурсы вокруг и потенциально заблокируете файл, не говоря уже об утечках памяти. Вместо этого всегда используйте using оператор

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

Однако, если вы хотите непрерывно записывать в файл, вам придется его сбросить

Метод FileStream.Flush

Очищает буферы для этого потока и заставляет любые буферизованные данные быть записано в файл.

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

Короче говоря, большинство потоков поддерживаются внутренним массивом (буфером), так что вы не трэш записываете. Размер по умолчанию равен 4 КБ, когда он достигает размера буфера, он автоматически сбрасывается. Если вы хотите видеть немедленные записи, вы должны очищать их каждый раз

Наконец, некоторые потоки имеют функцию автоматического сброса, которая может сделать эту работу за вас

AutoFlush

Получает или задает значение, указывающее, будет ли сбрасываться StreamWriter его буфер к базовому потоку после каждого вызова Write (Char)

Когда вы закончите с потоком всегда утилизируйте его

...