C#文件频繁打开,已打开异常

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

嘿,我有一个经常被调用的logger类,有时当它被快速重复调用时,它会抛出一个异常,即该文件已经被另一个应用程序打开。我们找到解决此问题的唯一方法是捕获异常,然后再次尝试打开它。。。我不知道如何妥善处理这件事

    /// <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是您可以使用的另一个现成的日志记录解决方案。它将创建文件,如果在特定大小后被切断,那么长时间后将被清除,洗衣服。。。