C#文件频繁打开,已打开异常
嘿,我有一个经常被调用的logger类,有时当它被快速重复调用时,它会抛出一个异常,即该文件已经被另一个应用程序打开。我们找到解决此问题的唯一方法是捕获异常,然后再次尝试打开它。。。我不知道如何妥善处理这件事C#文件频繁打开,已打开异常,c#,exception,C#,Exception,嘿,我有一个经常被调用的logger类,有时当它被快速重复调用时,它会抛出一个异常,即该文件已经被另一个应用程序打开。我们找到解决此问题的唯一方法是捕获异常,然后再次尝试打开它。。。我不知道如何妥善处理这件事 /// <summary> /// Open a log file based on a date /// </summary> /// <param name="date"> Date of the file to op
/// <summary>
/// Open a log file based on a date
/// </summary>
/// <param name="date"> Date of the file to open </param>
public static void OpenLogFile(DateTime date)
{
while (true)
{
try
{
logStream = File.Open("Logs/ems." + date.ToString("yyyy-MM-dd") + ".log", FileMode.Append);
break;
}
catch
{
continue;
}
}
}
/// <summary>
/// Writes to a log file the specified input
/// </summary>
/// <param name="input"> Content to write to the log file </param>
public static void Log(string className, string methodName, string input)
{
OpenLogFile(DateTime.Now);
using (StreamWriter s = new StreamWriter(logStream))
{
s.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + '[' + className + '.' + methodName + "] " + input);
}
CloseLogFile();
}
/// <summary>
/// Closes the current log file
/// </summary>
public static void CloseLogFile()
{
if (logStream != null)
{
logStream.Close();
logStream = null;
}
}
//
///根据日期打开日志文件
///
///要打开的文件的日期
公共静态void OpenLogFile(日期时间日期)
{
while(true)
{
尝试
{
logStream=File.Open(“Logs/ems.”+date.ToString(“yyyy-MM-dd”)+“.log”,FileMode.Append);
打破
}
抓住
{
继续;
}
}
}
///
///将指定的输入写入日志文件
///
///要写入日志文件的内容
公共静态无效日志(字符串类名称、字符串方法名称、字符串输入)
{
OpenLogFile(DateTime.Now);
使用(StreamWriter s=新StreamWriter(logStream))
{
s、 WriteLine(DateTime.Now.ToString(“yyyy-MM-dd HH:MM:ss”)++'['+className+'.+methodName+“]”+输入);
}
CloseLogFile();
}
///
///关闭当前日志文件
///
公共静态void CloseLogFile()
{
if(logStream!=null)
{
logStream.Close();
logStream=null;
}
}
由于这是一个日志文件,我认为一个明显(正确)的解决方案是在程序执行期间保持文件打开
如果不想使用已经实现的第三方记录器(如Apache),可以编写自己的小记录器类,该类使用线程安全机制将行写入文件
它可能是一个
静态类或单例。一般来说,程序开始和结束时的执行是可以预测的,因此应该明确在何处初始化和关闭对象/类。由于这是一个日志文件,我认为显而易见的(正确的)解决方案是在程序执行期间保持文件打开
如果不想使用已经实现的第三方记录器(如Apache),可以编写自己的小记录器类,该类使用线程安全机制将行写入文件
它可能是一个静态类或单例。一般来说,程序开始和结束时的执行是可以预测的,因此应该明确在何处进行初始化,并关闭对象/类。需要一点顺序,而不是完全没有磁盘。将日志消息存储在队列中,并使用单线程出列和写入项目。需要一点顺序,而不是所有的磁盘空闲。将日志消息存储在队列中,并使用单线程出列和写入项目。我猜这是一个多线程应用程序?您可以使用AutoResetEvent来控制对文件的访问。我猜这是一个多线程应用程序?您可以使用AutoResetEvent来控制对文件的访问。请确保在每次写入后使用flush(以便日志保持最新)。相对于实际写入文件,打开文件可能会有相当高的开销,我只会在绝对必要时关闭它。我会在日志函数中添加锁(threadObject)。如果你在给文件写那么多东西,我会让它打开。Microsoft Enterprise Library是您可以使用的另一个现成的日志记录解决方案。它将创建文件,如果在特定大小后关闭,则将其切断,在这么长时间后清除,洗衣服,…确保在每次写入后使用flush(以便日志保持最新)。相对于实际写入,打开文件可能会有相当高的开销,我只会在绝对必要时关闭它。我会在日志函数中添加一个锁(threadObject)。如果你在给文件写那么多东西,我会让它打开。Microsoft Enterprise Library是您可以使用的另一个现成的日志记录解决方案。它将创建文件,如果在特定大小后被切断,那么长时间后将被清除,洗衣服。。。