自闭式StreamWriter单例

我试图在其生命周期结束时进一步缩小Flush StreamWriter中的问题,实现类似单例的自关闭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的实例被关闭。

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

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

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

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

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

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

有关其他信息,请参阅这些相关问题
在应用程序关闭之前,如何确保在单例中处理对象?
C#中的一次性单身人士