C#StreamWriter-复制内存时检测到可能的I / O竞争状况

时间:2018-11-23 11:34:19

标签: c# wpf exception thread-safety streamwriter

我有一个使用记录器的应用程序。 相同的记录器可以在同一文件中从各种程序进行写入。 它用于持久执行。

仅在出现以下错误时: enter image description here

参考行是

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

因此,记录器流程从一开始就打开,一直在编写,然后在结尾处关闭。

在此先感谢您的帮助

帕特里克

1 个答案:

答案 0 :(得分:1)

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