在静态方法中管理一次性对象

fea*_*net 3 .net c# static stream disposable

public class SimpleLogger
{
    static readonly string logFile = ConfigurationManager.AppSettings["LogFile"];

    static StreamWriter GetStream()
    {
        return File.Exists(logFile) ?
            File.AppendText(logFile) : File.CreateText(logFile);
    }

    public static void Write(string msg)
    {
        using (var sw = GetStream())
        {
            sw.Write(msg);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码无法使用,因为它似乎没有正确关闭/处理流.后续写入会给出"正在使用的文件"IOException.

如果将类修改为使用非静态方法,则它似乎正常工作.

我不明白为什么会有任何行为差异?

Mar*_*ell 7

处理是罚款; GetStream提供一个开放的作家; Write关闭/处理它 - 排序.如果我猜的话,不过,问题是同时使用-即多线程(特别是在Web应用程序)访问该文件在同一时间.如果是这种情况,选项:

  • 使Write(以及任何其他访问文件)同步,因此只有一个调用者可以可能尝试打开该文件一次
  • 使用已经处理此场景的预先封装的日志框架(这里的常见方法包括同步,还包括:在本地缓冲数据,然后定期推送数据 - 避免一遍又一遍地打开文件)

特别是; 您唯一的静态是文件路径本身.因此,将其用作静态与实例方法之间没有显着差异.

作为旁注,File.AppendAllText这里可能有用,但不能避免并发问题.