QueueUserWorkItem是否具有锁定正确的实现?

时间:2012-07-28 15:18:22

标签: c# .net locking threadpool

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

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

1:lock是否必要?我想线程化日志并发现锁已经到位。因此,我不是改变代码,而是简单地包装成一个工作代表。

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

3:假设有几个logWriteDelegate工作人员已经入队:代表是否会按照收到的顺序调用?即 现在正在服务#32 ......现在服务#33

1 个答案:

答案 0 :(得分:2)

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

2:嗯,它会起作用。但它会使文件锁定,使其难以阅读。有预先存在的日志框架已经在这个问题上有很多工作 - 可能值得我使用它们。

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

相关问题