我有一个使用记录器的应用程序。 相同的记录器可以在同一文件中从各种程序进行写入。 它用于持久执行。
参考行是
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;
}
}
因此,记录器流程从一开始就打开,一直在编写,然后在结尾处关闭。
在此先感谢您的帮助
帕特里克
答案 0 :(得分:1)
是的,共享锁将起作用,但是它将在获取锁时阻止调用方,并且在锁的持续时间内,其他线程将阻止尝试获取锁;这可能会影响性能。您可以通过使用专用线程从要记录的项目队列中写入文件,而仅从调用线程将新项目添加到队列中来解决此问题。一旦开始变得如此复杂,最好使用log4net这样的现成日志记录库,它将为您完成所有这些工作。