代码之家  ›  专栏  ›  技术社区  ›  Syaiful Nizam Yahya

将日志写入“lock for edit”文件,这会引发异常。如何解决这个问题?

  •  3
  • Syaiful Nizam Yahya  · 技术社区  · 14 年前

    我正在运行多线程操作,每一个都在日志文件中附加一些信息。问题是,有时日志文件被锁定进行编辑,同时被其他线程访问,这会引发异常。如何确保日志正确写入?

    这是片段

     try
     {
      File.AppendAllText(fileName, appendString);
     }
     catch (System.Exception )
     {
     }
    

    现在,我只是忽略了这个例外。这导致一些日志没有写入。

    2 回复  |  直到 10 年前
        1
  •  6
  •   Pieter van Ginkel    14 年前

    您需要同步日志写入。

    发生的情况是两个线程同时附加到日志文件。

    请尝试以下操作:

    class Program
    {
        public static readonly object LogWriteLock = new object();
    
        // The rest of your Program class.
    }
    

    然后,在写入日志时:

    lock (Program.LogWriteLock)
    {
        File.AppendAllText(fileName, appendString);
    }
    

    其作用如下。创建一个对象( Program.LogWriteLock )用于“同步”登录操作。然后,当一个线程写入日志文件时,下一个线程只需等待第一个线程完成,然后再写入。

    你甚至可以把它包装成一个很好的小助手类,你会得到如下的结果:

    public static class LogHelper
    {
        private static readonly object _syncRoot = new object();
    
        public static void AppendToLog(string appendString)
        {
            lock (_syncRoot)
            {
                File.AppendAllText("log.txt", appendString);
            }
        }
    }
    

    更换 "log.txt" 使用您的实际日志文件位置。

        2
  •  0
  •   Carson    14 年前

    您是否试图创建一个线程,其唯一目的是更新日志,然后让其他线程添加到日志更新程序线程将处理的线程安全队列中?

    这似乎比从所有其他线程写入文件更好。