2009-07-15 3 views
1

У меня есть веб-приложение, которое будет записывать некоторую информацию в файл. Я ищу простой потокобезопасный неблокирующий класс регистратора файлов в C#. У меня мало опыта с потоками. Я знаю, что там есть большие компоненты регистрации, такие как log4Net, Блок регистрации журналов предприятия, ELMAH, но я не хочу внешней зависимости для моего приложения. Я думал об использовании этой реализации очереди http://www.codeproject.com/KB/cpp/lockfreeq.aspxПростой потокобезопасный неблокирующий класс регистратора файлов в C#

ответ

0

Метод FileStream.BeginWrite подталкивает операцию записи к потоку, который управляется системой. Это легкий бит.

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

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

1

, если вы не хотите использовать внешнюю библиотеку, вы можете использовать Trace класс

+1

Я также проголосую за класс Trace, если внешняя зависимость не требуется. Кроме того, многие разработчики просто добавляют компоненты, такие как Log4net и Enterprise Lib, без учета сложности их приложения. Классы Debug и Trace в .NET могут быть достаточными для многих приложений малого и среднего размера. Вы можете настроить их поведение, изменив записи конфигурации или написав собственный TraceListener. – A9S6

0

Я сделал простой механизм протоколирования в моем проекте в офисе.

У меня есть класс журнала, который является общим (Static C#).

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

После этого внутри этой темы я просто использую AutoresetEvent с вашим собственным WaitTime (я использую 250 мс).

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

Что нужно помнить ... У вас есть класс или структура, которые могут содержать дату, когда вход вошел, а не время, которое вы написали на диск, если вы выберете более длинное время, чтобы спать в вашей теме.

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

+0

Можете ли вы показать код? – M4N

+0

Я придумал одно и то же решение, но затем понял, что когда вы используете DeQueue, вы блокируете очередь, тем самым блокируя ведение журнала. Даже это происходит каждые 250 мс, вы все еще блокируете. – tesla