gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:18:54 27 4
gpt4 key购买 nike

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

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

1: lock 是必需的吗?我想对日志进行线程化,发现锁已经就位。因此,我没有更改该代码,而是简单地将其封装到一个工作委托(delegate)中。

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

3:假设多个 logWriteDelegate worker 已经入队:是否会按照 收到委托(delegate) 的顺序调用委托(delegate)?即,现在服务 #32 ...现在服务 #33

最佳答案

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

2:好吧,它会起作用的。但它会使文件保持锁定状态,使其难以阅读。已有的日志记录框架在解决这个问题上发挥了很大作用——我可能值得使用它们。

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

关于c# - 带锁的 QueueUserWorkItem 是否正确实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11702236/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com