gpt4 book ai didi

c# - 多线程文件写入排队

转载 作者:行者123 更新时间:2023-11-30 19:51:29 25 4
gpt4 key购买 nike

所以我有一个静态类应该用作日志文件管理器,能够将“消息”(字符串)添加到队列对象,并将消息推送到文件中。问题是,许多不同的线程应该排队,并且编写器也需要异步。目前,当我插入队列时,我也在检查写入器是否正在写入(bool 检查),如果不是,我设置 bool 然后开始写入,但我遇到关于文件访问的间歇性 IO 异常,然后有时会出现奇怪的书写行为。

有人想帮我解决这个问题吗?

最佳答案

如果您不想像我在其他答案中建议的那样大幅重组您的代码,您可以试试这个,它假设您的 LogManager 类具有:

  • 静态线程安全队列,_SynchronizedQueue
  • 写入时锁定的静态对象,_WriteLock

和这些方法:

public static void Log(string message) {
LogManager._SynchronizedQueue.Enqueue(message);
ThreadPool.QueueUserWorkItem(LogManager.Write(null));
}

// QueueUserWorkItem accepts a WaitCallback that requires an object parameter
private static void Write(object data) {
// This ensures only one thread can write at a time, but it's dangerous
lock(LogManager._WriteLock) {
string message = (string)LogManager._SynchronizedQueue.Dequeue();
if (message != null) {
// Your file writing logic here
}
}
}

只有一个问题:上面Write 方法中的lock 语句将保证一次只能有一个线程写入,但这是危险的。尝试写入文件时可能会出现很多错误,并且您不想无限期地保留(阻塞)线程池线程。因此,您需要使用一个允许您指定超时的同步对象,例如 Monitor,并像这样重写您的 Write 方法:

private static void Write() {
if (!Monitor.TryEnter(LogManager._WriteLock, 2000)) {
// Do whatever you want when you can't get a lock in time
} else {
try {
string message = (string)LogManager._SynchronizedQueue.Dequeue();
if (message != null) {
// Your file writing logic here
}
}
finally {
Monitor.Exit(LogManager._WriteLock);
}
}
}

关于c# - 多线程文件写入排队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1064374/

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