我正在考虑创建一个异步日志记录组件,该组件具有一个专用线程,该线程将从队列中读取新项目并写入数据库,文件等。如果我创建一个线程作为后台线程 - 它将在该过程中立即终止因此,队列中的所有项目都将丢失。如果我创建它是前景 - 我将不得不弄清楚何时停止它,因为它会阻止应用程序关闭。有没有办法让开发人员记得在应用程序退出之前“停止”记录功能?
答案 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()
{
...
}
}
在日志记录例程中,您需要测试线程是否正在运行,然后在排队日志写入或直接附加到日志输出之间做出决定。这样,异步线程之前和之后的日志消息将继续正常工作。