繁体   English   中英

C#在第3方dll创建的事件中记录到文件。 这会导致锁定吗?

[英]C# Logging to a file in events created by 3rd party dll. Can this cause locking?

我正在使用以下内容登录到文本文件。 从我的代码中的事件中调用了Log(),这些事件是由第三方Dll触发的。 第三方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);
        }
}

是的,这可能会导致并发问题,我不确定,但是如果您打开1个StreamWriter(最好在您的方法中使用“ lock”语句),则可能会解决问题。 否则,请看一下log4net之类的东西,它们提供了用于从多个线程记录文件的解决方案。

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

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

System.IO.FileStream fl = new FileStream("path", FileMode.Open);
fl.Write(byte[],int,int);
fl.dispose;

是的,这可能会引起问题。 由于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);
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM