【问题标题】:C# StreamWriter - Probable I/O race condition detected while copying memoryC# StreamWriter - 复制内存时检测到可能的 I/O 竞争条件
【发布时间】:2019-04-26 00:32:07
【问题描述】:

我有一个使用记录器的应用程序。 同一个记录器可以从同一个文件中的不同程序写入。 它用于长期处决。

只有一次我收到以下错误:

引用的行是

    swLogger.WriteLine(newLines);

我在各种在线线程中发现了同样的问题,主要是使用 Console.WriteLine。 我必须承认——除了阅读它们——我还没有完全理解这个问题。

因为它只发生过一次,我无法重现该问题。

话虽如此 - 如果我对问题的理解没有错误 - 是否可以将解决方案放在包含整个例程的 lock 指令中?

代码是:

public static bool WriteLog(string newLines, bool AddDateTime = true, bool ShowMessageBox = false)
{

    try
    {

        long max = MaxLogSizeMB * 1024 * 1024;

        if (lenTot > max)
        {
            if (swLogger != null)
                swLogger.Close();
            File.Delete(FileName);
            swLogger = new StreamWriter(FileName);
            lenTot = 0;
        }

        if (AddDateTime)
            newLines = "[" + DateTime.Now.ToString("dd/MM/yy HH:mm:ss.fff") + "] " + newLines;
            lenTot += newLines.Length + 2;//Environment.Newline
            swLogger.WriteLine(newLines);<-----

            return true;
        }
        catch (Exception exc)
        {
            return false;
        }
    }

所以记录器流在开始时打开,一直写入并在结束时关闭。

提前感谢您的帮助

帕特里克

【问题讨论】:

  • 您好,请考虑log4netSerilog 框架。它们在设计上是线程安全的,所以你不需要这个麻烦;-)

标签: c# wpf exception thread-safety streamwriter


【解决方案1】:

是的,共享锁可以工作,但它会在获取锁时阻塞调用者,并且在锁期间其他线程将阻塞尝试获取锁;这可能会影响性能。您可以通过有一个专用线程来解决这个问题,该线程从要记录的项目队列中写入文件,并且只从调用线程将新项目添加到队列中。一旦你开始变得复杂,你最好使用像 log4net 这样现成的日志库,它会为你做这一切。

【讨论】:

  • 感谢您的帮助。我想我会选择 log4net 解决方案。这就是说 - 只是为了了解哪种解决方案作为替代方案会更好:1. 使用锁定来防止对流写入器的双重访问,因此不会出现异常 2. 不使用锁定,将其放入 try catch 但忽略执行?哪个会更快?谢谢
  • 不可能在 1 和 2 之间进行选择,因为有很多未知因素是您的情况所独有的。您需要在目标环境中对两者进行分析以在它们之间做出决定(如果您想花精力做这件事而不是使用例如 log4net)。
  • @Polyfun,当我们只有一个线程访问 StreamWriter 对象并写入文件流(使用队列)时,我遇到了这种情况。但是,在用户的机器上记录了相同的 I/O 竞争条件。我们无法重现此错误。是否还有其他情况即使单个线程也可能导致此异常?
  • @ChuckNorris 我建议您在每次写入时记录正在访问 StreamWriter 的日志线程的线程 ID。这将证明有多少线程正在写入 StreamWriter。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多