在静态类中的记录器上使用锁时出现异常

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异常

使用JDBC连接将记录插入Apache Ignite Cluster时出现异常

保存一对多实体时出现神奇记录异常

Hibernate:10个或更多用户同时插入记录时出现异常

iOS:更新数据时出现CoreData异常

使用CsvHelper写入数据时出现异常