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 这样的现成日志库,它会为你做所有这些。
我有一个使用记录器的应用程序。 同一个记录器可以从同一个文件中的不同程序写入。 它用于长期执行。
只有一次我得到以下错误:
引用的行是
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 这样的现成日志库,它会为你做所有这些。