自闭式StreamWriter单例

时间:2016-04-08 15:30:58

标签: c# .net singleton dispose streamwriter

我试图进一步缩小Flush StreamWriter at the end of its lifetime实施类似单身自我关闭StreamWriter的问题:

class Foo : System.IO.StreamWriter
{
    private static readonly Foo instance = new Foo( "D:/tmp/test" );

    private Foo( string path )
        : base( path )
    {
    }

    ~Foo()
    {
        this.Close();
    }

    public static Foo Instance
    {
        get
        {
            return instance;
        }
    }
}

预期的效果是在像

这样的示例程序中
class Program
{
    private static void Main( string[] args )
    {
        Foo.Instance.Write( "asdf\n" );
    }
}

垃圾收集器导致Foo的实例关闭。

这不起作用。显然,当StreamWriter的析构函数运行时Foo已经消失,我得到System.ObjectDisposedException

如何以合适的方式在流上调用Close()并防止数据丢失?

1 个答案:

答案 0 :(得分:2)

  

显然,当Foo的析构函数运行时,StreamWriter已经消失了

是。在程序终止时,假设你的对象完全得到GC(不能保证它会是),运行时不会对它执行终结器的顺序提供任何保证。这两个对象都无法访问,并且可以同时进行最终确定,因此它们的终结器可以按任何顺序运行。

终结者只有 作为错误代码的后盾。而且他们也不是100%可靠的。这就是为什么你应该努力避免错误的代码。

您需要一种确定性的方法来在进程退出时处理单例对象。您可以将其置于程序主逻辑的控制之下,该逻辑控制进程生命周期,并让它处理单例(例如,通过您为此目的编写的公共方法)。另一个选择是在你的单例的构造函数中订阅AppDomain.ProcessExit事件,并让处理程序关闭那里的单例。

有关其他信息,请参阅这些相关问题:
How can I ensure that I dispose of an object in my singleton before the application closes?
Disposable singleton in C#