实现锁定正确的QueueUserWorkItem是否正确



我实现了一个日志记录方法,如下所示:

 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:没有;对于锁和池,这是不期望在最终文件中进行严格排序的两个不同原因。事实上,由于池的原因,单个线程的消息可能会出现无序。如果您想要排序,您需要向(同步的)队列写入,并有一个专门的工作人员从队列中提取数据(同步的数据)并写入日志文件。同样,现有的日志记录框架将为您解决这个问题。

最新更新