【发布时间】:2010-11-13 23:19:29
【问题描述】:
我在我的一个项目中使用 Enterprise Library 4 进行日志记录(和其他目的)。我注意到我正在做的日志记录有一些成本,我可以通过在单独的线程上进行日志记录来减轻这些成本。
我现在这样做的方式是创建一个 LogEntry 对象,然后在调用 Logger.Write 的委托上调用 BeginInvoke。
new Action<LogEntry>(Logger.Write).BeginInvoke(le, null, null);
我真正想做的是将日志消息添加到队列中,然后有一个线程将 LogEntry 实例从队列中拉出并执行日志操作。这样做的好处是日志记录不会干扰执行操作,并且不是每个日志记录操作都会导致作业被抛出到线程池中。
如何以线程安全的方式创建一个支持多个写入器和一个读取器的共享队列?非常感谢一些旨在支持多个写入器(不会导致同步/阻塞)和单个读取器的队列实现示例。
也将不胜感激有关替代方法的建议,但我对更改日志记录框架不感兴趣。
【问题讨论】:
-
@spoon,我添加了一个稍微改进的版本,请记住,在使用它之前您必须对其进行大量测试,因为我刚刚敲了它。
-
虽然不直接适用于这个问题(因为它说的是 EntLib 4),但 Enterprise Library 6 现在支持开箱即用的异步登录。
标签: c# multithreading logging enterprise-library