Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在静态方法中管理一次性对象_C#_.net_Static_Stream_Disposable - Fatal编程技术网

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

C# 在静态方法中管理一次性对象,c#,.net,static,stream,disposable,C#,.net,Static,Stream,Disposable,上述代码在使用中失败,因为它似乎没有正确关闭/处理流。后续写入会产生“正在使用的文件”IOException 如果类被修改为使用非静态方法,则它似乎工作正常 我不明白为什么会有行为上的差异 处理良好GetStream提供了一个开放的编写器写入关闭/处理它-已排序。但是,如果我不得不猜测的话,问题是并发使用,即多个线程(特别是在web应用程序中)同时访问文件。如果是这种情况,选项: 使Write(以及对该文件的任何其他访问)同步,以便只有一个调用者可以尝试一次打开该文件 使用一个预先封装的日志框

上述代码在使用中失败,因为它似乎没有正确关闭/处理流。后续写入会产生“正在使用的文件”IOException

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

我不明白为什么会有行为上的差异

处理良好
GetStream
提供了一个开放的编写器<代码>写入关闭/处理它-已排序。但是,如果我不得不猜测的话,问题是并发使用,即多个线程(特别是在web应用程序中)同时访问文件。如果是这种情况,选项:

  • 使
    Write
    (以及对该文件的任何其他访问)同步,以便只有一个调用者可以尝试一次打开该文件
  • 使用一个预先封装的日志框架,该框架已经可以处理这种情况(这里的常见方法包括同步,但也包括:在本地缓冲数据,然后定期向下推送数据-避免反复打开文件)
特别是,;您唯一的静态状态是文件路径本身。因此,将其用作静态方法与实例方法之间没有显著区别


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

我认为从静态更改为实例不会解决问题,因为它们最终都在争夺静态资源(文件)。这个答案可能对你有帮助。如果两个方法都保持静态,并声明了一个静态同步对象以调用要锁定的线程(因为资源本身是静态的),可能会有所帮助,例如:

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);
        }
    }
}
用于从多个线程同步访问文件,因此:

private static object _objectLock = new object();

那么,你是说当我将它改为使用非静态方法时,它似乎起作用的唯一原因是因为我在测试它时“幸运”了吗?@fearofa-看起来,你可以进行测试了。在静态版本中设置睡眠(10)。
public static void Write(string msg)      
{        
    lock(_objectLock)
    {  
        using (var sw = GetStream())          
        {              
            sw.Write(msg);          
        }
    }      
}