Ich habe versucht, das Problem in Flush StreamWriter at the end of its lifetime Implementierung eines Singleton artige selbstschließ StreamWriter
weiter zu verengen:Selbstschließender Stream Singletons
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;
}
}
}
Die beabsichtigte Wirkung ist, dass in einem Beispielprogramm wie
class Program
{
private static void Main(string[] args)
{
Foo.Instance.Write("asdf\n");
}
}
Der Garbage Collector bewirkt, dass die Instanz Foo
geschlossen wird.
Dies funktioniert nicht. Anscheinend ist die StreamWriter
bereits weg, als Foo
Destruktor ausgeführt wird, und ich bekomme eine System.ObjectDisposedException
.
Wie rufe ich Close()
auf dem Strom in einer geeigneten Weise an und verhindern Sie Verlust von Daten?
ich sehe haben die Referenzquelle von Microsoft für Filestream. Wenn der Destruktor aufgerufen wird, gibt es bereits einen Versuch, in die Datei zu spülen, also müssen Sie nicht tun, was Sie getan haben. Das Problem besteht darin, dass GC das Handle für die Datei bereits vor dem letzten Leeren schließt, sodass es möglicherweise nicht funktioniert. Referenz: http://referencesource.microsoft.com/#mscorlib/system/io/filestream.cs –
@ThariqNugrohotomo Sie meinen den Code in 'FileStream.Dispose'? Ich würde sagen, dass 'Dispose' in meinem Beispiel nicht aufgerufen wird. – mkluwe