.NET 2.0:File.AppendAllText(...) - 线程安全实现

MrE*_*yes 11 c# file-io thread-safety .net-2.0

作为闲置好奇心的练习,请考虑以下简单的日志记录类:

internal static class Logging
{
    private static object threadlock;

    static Logging()
    {
        threadlock = new object(); 
    }

    internal static void WriteLog(string message)
    {
        try
        {
            lock (threadlock)
            {
                File.AppendAllText(@"C:\logfile.log", message);
            }
        }
        catch
        {
            ...handle logging errors...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是否lock需要File.AppendAllText(...)通过自己的实现来保持本身的线程安全?

搜索有关这方面的信息会产生许多相互矛盾的信息,有些人说是,有些人说不.MSDN什么也没说.

jas*_*son 16

File.AppendAllText将要获取日志文件的独占写锁定,这将导致任何并发线程尝试访问该文件以引发异常.所以,是的,您需要一个静态锁定对象来防止多个线程同时尝试写入日志文件并引发IOException.

如果这将是一个问题,我真的建议记录到数据库表,这将更好地处理并发日志编写器.

或者,您可以使用TextWriterTraceListener哪个是线程安全的(好吧,它将为您执行锁定;我宁愿尽可能少地编写自己的多线程代码).

  • 你误解了,这是被锁定写入的文件.因此,任何其他尝试同时写入的线程都将收到异常.为防止这种情况,您必须使用程序中的锁序列化写入. (5认同)