我正在考虑创建一个具有专用线程的异步日志记录组件,它将从队列读取新项目并写入数据库,文件等。如果我创建一个线程作为背景 - 它将会过程结束后立即终止,因此队列中的所有项目都将丢失。如果我创建它是一个前景 - 我将不得不找出何时停止它,因为它会阻止应用程序关闭。有什么办法可以让开发人员在应用程序退出之前记得“停止”日志记录功能吗?专用线程日志记录.net
1
A
回答
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()
{
...
}
}
在你的日志程序中,你将要测试是否线程运行,然后排队日志写入之间决定或直接附加到日志输出。通过这种方式,异步线程之前和之后的日志消息将继续正常工作。
相关问题
- 1. .NET日志记录WebService
- 2. 日志记录和多线程
- 3. 跨多线程的Java日志记录
- 4. 线程安全日志记录
- 5. 线程实时日志记录
- 6. 实现线程安全日志记录
- 7. 企业库日志记录 - 多线程日志到多个日志文件
- 8. 数据库日志记录在日志记录过程
- 9. netbeans日志记录教程
- 10. .NET中的密钥日志记录
- 11. .NET中的高性能日志记录
- 12. Castle,AOP和.NET中的日志记录
- 13. .NET日志记录框架设计
- 14. .Net Trace Listener日志记录级别
- 15. Java日志记录:它是日志还是日志记录器?
- 16. 多线程应用程序中的日志记录活动
- 17. 多线程的小应用程序和日志记录
- 18. 使用Python日志记录管理日志记录器
- 19. Android中的HttpURLConnection线路日志记录
- 20. 使用.Net Core Console日志记录器记录事件日期时间
- 21. 。应用程序日志记录
- 22. web2py应用程序日志记录
- 23. Java应用程序+日志记录
- 24. 日志记录应用程序块
- 25. Java小应用程序日志记录
- 26. c#线程安全日志记录问题不使用singleton
- 27. 使用python日志记录远程日志
- 28. Windows Azure日志记录:WADLogsTable作为应用程序日志?
- 29. 日志记录应用程序块 - 记录调用者
- 30. redis用于日志记录
不要创建一个专门的线程来处理这个问题......它将花费大部分时间无所事事。这对于日志框架来说非常浪费。对于这个问题,首先避免编写自己的日志框架;这是一个复杂的问题,已经有许多解决方案可供您使用。 – Servy
这个其他问题可能会回答你的问题:[如何为log4net创建一个异步封装?](http://stackoverflow.com/q/7044497/1796930) – Alexander