J'ai essayé de limiter davantage le problème dans Flush StreamWriter at the end of its lifetime la mise en œuvre d'un singleton comme l'auto-fermeture StreamWriter
:fermeture automatique StreamWriter singleton
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;
}
}
}
L'effet recherché est que, dans un exemple de programme comme
class Program
{
private static void Main(string[] args)
{
Foo.Instance.Write("asdf\n");
}
}
le garbage collector provoque la fermeture de l'instance Foo
.
Cela ne fonctionne pas. Apparemment, le StreamWriter
est déjà parti quand destructor de Foo
fonctionne, et je reçois un System.ObjectDisposedException
.
Comment appeler Close()
sur le flux de manière à prévenir la perte appropriés et, de données?
J'ai voir le microsoft référence source pour FileStream. Quand le destructeur est appelé, il y a déjà quelques tentatives de vidage, donc pas besoin de faire ce que vous avez fait. Le problème est que GC peut déjà fermer le handle au fichier avant que le dernier vidage ne se produise, il peut donc ne pas fonctionner. Référence: http://referencesource.microsoft.com/#mscorlib/system/io/filestream.cs –
@ThariqNugrohotomo Vous voulez dire le code dans 'FileStream.Dispose'? Je dirais que "Dispose" n'est pas appelé dans mon exemple. – mkluwe