在静态类中的记录器上使用锁时出现异常
Posted
技术标签:
【中文标题】在静态类中的记录器上使用锁时出现异常【英文标题】:Exception when using a lock on a logger in a static class 【发布时间】:2021-04-27 20:00:57 【问题描述】:我正在为我的多线程应用程序创建一个简单的静态日志类。 这是我的日志代码:
public static class Logging
private static readonly string _logFile = "files/Logfile.txt";
private static object _obj = new Object();
public static void Log(string logMessages)
lock (_obj)
using (StreamWriter sw = File.AppendText(_logFile))
sw.WriteLine(logMessages);
从多个线程和类调用 log 方法。 但是我不断收到此异常:
System.IO.IOException: The process cannot access the file \GUI\bin\Debug\files\Logfile.txt' because it is being used by another process.
有人知道原因或解决方案是什么吗? 提前致谢!
【问题讨论】:
您是否有多个进程尝试执行此操作? (锁是单进程)。此外,File.AppendAllText
可能是更简单的选择。
@MarcGravell 它确实被 1 个程序多次调用,但因为它是多线程的,它可以并且将同时发生。但是,很难使用所有线程中所有类中的所有方法都能够使用的锁对象。
为什么很难使用所有方法、类和线程都可以使用的锁对象?看来static object _obj
正是这样一个对象。
我不再得到错误的帮助!我不知道为什么,但我认为我不是在这部分代码中使用了错误的锁,而是在调用日志记录的代码中。
【参考方案1】:
我在不同的状态下测试了这段代码,但没有出现任何错误,并且每个任务都在其他任务之后完成。 结果中的错误可能与其他事情有关。
var t1 = new Task(()=> Log(txt));
var t2 = new Task(()=> Log(txt));
var t3 = new Task(()=> Log(txt));
t1.Start();
t2.Start();
t3.Start();
Task.WaitAll(t1, t2, t3);
【讨论】:
以上是关于在静态类中的记录器上使用锁时出现异常的主要内容,如果未能解决你的问题,请参考以下文章
从默认构造函数中添加静态类中的实例类时出现Stack-Overflow异常