我实现了一个日志记录方法,如下所示:
ThreadPool.QueueUserWorkItem((state) => {
lock (appendLock) {
using (StreamWriter log = File.AppendText(_logFile)) {
log.WriteLine(message);
}
}
}, null);
1:lock
有必要吗?我想通过线程记录,发现锁已经到位。因此,我并没有修改代码,而是简单地封装到一个worker委托中。
2:假设需要锁:这是将包含锁的委托排入队列的正确实现吗?多个线程可能请求日志写入的可能性相当高。通过将委托排入工作线程的队列,文件I/O执行的长度不应影响应用程序本身。
3:假设几个logWriteDelegate
工作人员已入队:是否会按照接收委托的顺序调用委托?即现在服务32号。。。现在正在服务#33
1:是的,需要锁定它。它可以由多个线程访问,尤其是在使用池的情况下。
2:好的,它会起作用的。但它会将文件锁定,使其难以读取。有一些预先存在的日志框架在这个问题上做了很多工作——也许值得我使用它们。
3:没有;对于锁和池,这是不期望在最终文件中进行严格排序的两个不同原因。事实上,由于池的原因,单个线程的消息可能会出现无序。如果您想要排序,您需要向(同步的)队列写入,并有一个专门的工作人员从队列中提取数据(同步的数据)并写入日志文件。同样,现有的日志记录框架将为您解决这个问题。