c# - 带锁的 QueueUserWorkItem 是否正确实现?

标签 c# .net locking threadpool

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

 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/

相关文章:

c# - Fluent NHibernate 日期时间 UTC

.net - 无法转换类型为 'WhereArrayIterator` 1[System.String ]' to type ' System.String[]' 的对象

c# - 每当请求该类的任何方法时自动调用公共(public)方法

c# - 在 c# Windows 窗体中通过字符串引用组合框名称时将项目添加到组合框

jquery - 从 jQuery 安全地调用安全的 WebService

multithreading - Condition 的哪些实现不需要当前线程持有锁?

.net - 在线程(.NET)中锁定或 try catch 字典是否更有效

c - __atomic_test_and_set 与 __atomic_compare_exchange_n

c# - 如何将自定义 header 添加到 SignalR 的 Typescript 客户端?

c# - MySqlDataAdapter 与 GroupBy sql 字符串返回空内容