Быстрое открытие и закрытие System.io.streamwriter в C #

StackOverflow https://stackoverflow.com/questions/2692216

  •  01-10-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Хет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top