C# StreamWriter - 复制内存时检测到可能 I/O 竞争条件

C# StreamWriter - Probable I/O race condition detected while copying memory

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

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

引用的行是

    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;
        }
    }

所以logger流程一开始就打开,一直写入,最后关闭。

在此先感谢您的帮助

帕特里克

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