繁体   English   中英

.net专用线程

[英]dedicated thread for logging .net

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

我相信您可以:

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

这样,您可以使前台线程了解即将到来的厄运。

首先,我必须同意以上评论。 我只会使用NLog之类的东西,而不是尝试自己动手做。 虽然一开始似乎有很多东西要学习,但它仍然比编写和调试自己的要好。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM