用于记录.net的专用线程

时间:2013-12-20 19:35:21

标签: c# multithreading logging asynchronous

我正在考虑创建一个异步日志记录组件,该组件具有一个专用线程,该线程将从队列中读取新项目并写入数据库,文件等。如果我创建一个线程作为后台线程 - 它将在该过程中立即终止因此,队列中的所有项目都将丢失。如果我创建它是前景 - 我将不得不弄清楚何时停止它,因为它会阻止应用程序关闭。有没有办法让开发人员记得在应用程序退出之前“停止”记录功能?

2 个答案:

答案 0 :(得分:0)

我相信你可以:

  • 订阅AppDomain.ProcessExit活动;
  • 使用Volatile sentinel变量作为关闭标记;
  • ProcessExit事件触发时设置标志;
  • 监视线程内的标志状态,并相应地正常关闭。

通过这种方式,您可以让前景线程意识到即将发生的厄运。

答案 1 :(得分: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()
    {
        ... 
    }
}    

在日志记录例程中,您需要测试线程是否正在运行,然后在排队日志写入或直接附加到日志输出之间做出决定。这样,异步线程之前和之后的日志消息将继续正常工作。