Быстрое открытие и закрытие System.IO.StreamWriter в C # - PullRequest
4 голосов
/ 22 апреля 2010

Предположим, у вас есть файл, в который вы программно регистрируете информацию о процессе.Вроде как ваш типичный отладочный Console.WriteLine, но из-за характера кода, который вы тестируете, у вас нет консоли для записи, поэтому вы должны написать ее где-нибудь как файл.Моя текущая программа использует System.IO.StreamWriter для этой задачи.

Мой вопрос касается подхода к использованию StreamWriter.Лучше ли открыть только один экземпляр StreamWriter, выполнить все операции записи и закрыть его после завершения всего процесса?Или лучше открыть новый экземпляр StreamWriter, чтобы записать строку в файл, а затем сразу же закрыть его и делать это каждый раз, когда нужно что-то записать?В последнем подходе этому, вероятно, способствовал бы метод, который сделал бы именно это для данного сообщения, вместо того, чтобы раздуть код основного процесса чрезмерным количеством строк.Но наличие метода, помогающего в этой реализации, не обязательно делает его лучшим выбором.Есть ли существенные преимущества при выборе одного или другого подхода?Или они функционально эквивалентны, оставляя выбор на плечах программиста?

Ответы [ 3 ]

4 голосов
/ 22 апреля 2010

Посмотрите на готовые реализации журналирования; они могут избавить вас от многих головных болей. Очевидно, что сохранение потока открытым означает, что вы можете потерять некоторые конечные данные, если он выйдет из строя, но может повысить производительность от буферизации ввода-вывода. Некоторые реализации также могут предлагать такие функции, как асинхронное ведение журнала из очереди / очереди.

1 голос
/ 22 апреля 2010

Я бы помещал в буфер / помещал в очередь данные и записывал в файл, как только он достигнет порога, и очищал всю очередь, когда приложение закрывалось / выходило нормально.сбой приложения, вы можете потерять элементы в очереди ...

HTH.

1 голос
/ 22 апреля 2010

Повторное открытие / закрытие нового StreamWriter для каждой записи создаст много ресурсов для GC, а также накладывает дополнительные расходы на приложение из-за фактического поиска файла для каждой операции открытия.С другой стороны, удержание одного потока открытым приведет к блокировке файла.Это зависит от ситуации.

Вы не хотите, чтобы механизм ведения журнала стал узким местом для производительности, поэтому пишите в один поток.Сделайте его небуферизованным или AutoFlush для критической отладки (но имейте в виду, что это также влияет на производительность).

Я бы следовал модели log4net, создавал поток статического журнала и записывал в этот одиночный файл.В любом случае, загляните в log4net, чтобы вы не свернули свои собственные.http://logging.apache.org/log4net/index.html

...