0

我正在使用以下内容登录到文本文件。Log() 是从我的代码中由第 3 方 Dll 触发的事件中调用的。第 3 方 Dll 创建多个线程,因此它可以触发每个线程内的事件。

我的问题是,当我的代码中触发事件以执行以下日志记录时,我是否可能会提出一个问题,即有两个事件试图同时写入日志文件并且锁定或事件一次发生一个?

private void Log(string message)
{
        if(!Directory.Exists(AssemblyDirectory + @"\Logs"))
            Directory.CreateDirectory(AssemblyDirectory + @"\Logs");

        using (StreamWriter sw = new StreamWriter(AssemblyDirectory + @"\Logs\" + DateTime.Today.ToString("yyyyMMdd") + ".log", true))
        {
            sw.AutoFlush = true;
            sw.Write(message);
        }
}
4

3 回答 3

1

是的,这可能会导致并发问题,我不确定,但如果您保持 1 个 StreamWriter 处于打开状态(最好在您的方法中使用“锁定”语句),它可能会解决问题。否则看看像 log4net 这样的东西,他们有从多个线程记录到文件的解决方案。

于 2012-10-03T09:24:52.197 回答
0

它可能发生。我会使用 FileStream 类来使用日志文件。它试图通过打开文件来访问它。

如果 FileStream 类引发异常并且正在使用该文件

System.IO.FileStream fl = new FileStream("path", FileMode.Open);
fl.Write(byte[],int,int);
fl.dispose;
于 2012-10-03T09:26:32.110 回答
0

是的,这可能会导致问题。由于 Zidad log4net 可以处理多个线程。另一方面,如果您想保留您编写的记录器,我建议您利用线程的唯一 id

using (StreamWriter sw = new StreamWriter(AssemblyDirectory + @"\Logs\" +
      DateTime.Today.ToString("yyyyMMdd") + 
      (new System.Diagnostics.TraceEventCache()).ThreadId +".log", true))
{
    sw.AutoFlush = true;
    sw.Write(message);
}

在所有线程完成后,您可以从其他线程构建一个文件。

于 2012-10-03T09:36:46.197 回答