我实现了一种日志记录方法,如下所示:
ThreadPool.QueueUserWorkItem((state) => {
lock (appendLock) {
using (StreamWriter log = File.AppendText(_logFile)) {
log.WriteLine(message);
}
}
}, null);
1:锁
有必要吗?我想对日志进行线程化,发现锁已经就位。因此,我没有更改该代码,而是简单地包装到一个工作委托(delegate)中。
2:假设需要锁:这是将包含锁的委托(delegate)排队的正确实现吗?多个线程请求日志写入的可能性相当高。通过将委托(delegate)排队到工作线程,文件 I/O 执行的长度不应影响应用程序本身。
3:假设多个 logWriteDelegate
工作线程已入队:委托(delegate)是否会按照接收顺序调用?即,现在服务#32 ...现在服务#33
最佳答案
1:是的,需要锁定。它可以被多个线程访问,特别是因为您正在使用池。
2:好吧,它会起作用的。但它会使文件保持锁定状态,使其难以读取。有一些预先存在的日志框架在解决这个问题上发挥了很大作用 - 我可能值得使用它们。
3:没有;对于锁和池,这是不期望最终文件中严格排序的两个不同原因。事实上,由于池的原因,单线程消息可能会出现乱序。如果您想要排序,则需要写入(同步)队列,并有一个专门的工作人员将数据(同步)从队列中拉回并写入日志文件。同样,现有的日志框架将为您解决这个问题。
关于c# - 带锁的 QueueUserWorkItem 是否正确实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11702236/