2013-12-20 3 views
1

Я рассматриваю возможность создания асинхронного компонента протоколирования, имеющего выделенный поток, который будет считывать новые элементы из очереди и записывать в базу данных, файл и т. Д. Если я создам поток как фоновый, это будет как только процесс завершится, все объекты в очереди будут потеряны. Если я создаю, это первый план - мне придется выяснить, когда его остановить, поскольку это предотвратит закрытие приложения. Есть ли способ не заставлять разработчиков забывать «останавливать» функции ведения журнала до выхода приложения?посвященный поток для регистрации .net

+8

Не создавайте выделенную тему для управления этим в первую очередь ... он будет тратить большую часть своего времени на то, чтобы ничего не делать. Это довольно расточительно для рамки ведения журнала. В этом случае избегайте создавать собственные рамки ведения журнала; это сложная проблема, которая уже имеет множество доступных решений. – Servy

+0

Этот вопрос может ответить на ваш вопрос: [Как создать асинхронную оболочку для log4net?] (Http://stackoverflow.com/q/7044497/1796930) – Alexander

ответ

0

Я полагаю, вы можете:

  • Подписаться на AppDomain.ProcessExit события;
  • Использовать контрольную переменную Volatile в качестве знака отключения ;
  • Установите флаг при возникновении события ProcessExit;
  • Контролируйте состояние флага внутри вашей нити и изящно закрывайте соответствующим образом.

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

+1

Похоже, что OP не имеет возможности изящно закрыться. Не похоже, что его очередь настойчива. –

+0

Это похоже на то, что @JohnSaunders, я согласен - но также кажется, что он имеет некоторый контроль над тем, как создан выделенный поток. Ответ может касаться его беспокойства по поводу предотвращения закрытия приложения. – OnoSendai

0

Прежде всего, я должен согласиться с комментариями выше. Я бы просто использовал что-то вроде вместо того, чтобы пытаться катиться самостоятельно. Хотя может показаться, что сначала есть чему поучиться, но это все же лучше, чем писать и отлаживать свои собственные.

Если вы действительно хотите путешествовать по этой дороге, я бы рекомендовал использовать инструкцию 'using' и IDisposable для управления асинхронным поведением. Просто запустите нормальный поток в ctor и сигнал & Присоединитесь к теме на Dispose().

Пример использования:

void Main() 
{ 
    using (new Logging()) 
    { 
     ... 
    } 
} 

Пример класса (непроверенные):

class Logging :IDisposable 
{ 
    ManualResetEvent _stop = new ManualResetEvent(false); 
    Thread _worker = null; 

    public Logging() 
    { 
     _worker = new Thread(AsyncThread); 
     _worker.Start(); 
    } 

    public void Dispose() 
    { 
     _stop.Set(); 
     _worker.Join(); 
    } 

    public void AsyncThread() 
    { 
     ... 
    } 
}  

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

Смежные вопросы