2

我已经实现了如下的日志记录方法:

 ThreadPool.QueueUserWorkItem((state) => {
    lock (appendLock) {
       using (StreamWriter log = File.AppendText(_logFile)) {
          log.WriteLine(message);
       }
    }
 }, null);

1:有lock必要吗?我想线程化日志记录并发现锁已经到位。因此,我没有更改该代码,而是简单地包装了一个工人代表。

2:假设需要锁:这是将包含锁的委托加入队列的正确实现吗?多个线程可能正在请求日志写入的可能性相当高。通过将委托排队到工作线程,文件 I/O 执行的长度不应影响应用程序本身。

3:假设有几个logWriteDelegate工人已经入队:代表会按照他们被接收的顺序被调用吗?即,现在服务#32 ...现在服务#33

4

1 回答 1

2

1:是的,锁定它是必需的。它可以被多个线程访问,特别是因为您正在使用池。

2:嗯,它会起作用的。但它会使文件保持锁定状态,使其难以阅读。有一些预先存在的日志框架在这个问题上做了很多工作——可能值得我使用它们。

3:没有;使用锁和池,这是不期望在最终文件中严格排序的两个独立原因。事实上,由于池的原因,单个线程的消息可能会出现乱序。如果你想订购,你需要写入一个(同步的)队列,并有一个专门的工作人员将数据(同步)从队列中拉回并写入日志文件。同样,现有的日志框架将为您解决这个问题。

于 2012-07-28T15:23:44.903 回答