2013-12-20 59 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

首先我必须同意上面的意见。我只会使用像NLog而不是试图推出自己的。虽然看起来有很多东西需要学习,但它仍然比编写和调试自己的要好。

如果你真的想走这条路,我的建议是使用“使用”语句和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() 
    { 
     ... 
    } 
}  

在你的日志程序中,你将要测试是否线程运行,然后排队日志写入之间决定或直接附加到日志输出。通过这种方式,异步线程之前和之后的日志消息将继续正常工作。