Singleton à fermeture automatique StreamWriter

J’ai essayé de réduire davantage le problème dans Flush StreamWriter à la fin de sa vie en implémentant un StreamWriter fermeture StreamWriter :

 class Foo : System.IO.StreamWriter { private static readonly Foo instance = new Foo( "D:/tmp/test" ); private Foo( ssortingng path ) : base( path ) { } ~Foo() { this.Close(); } public static Foo Instance { get { return instance; } } } 

L’effet recherché est que, dans un exemple de programme tel que

 class Program { private static void Main( ssortingng[] args ) { Foo.Instance.Write( "asdf\n" ); } } 

le ramasse-miettes provoque la fermeture de l’instance de Foo .

Ça ne marche pas . Apparemment, le StreamWriter est déjà parti lorsque le destructeur de Foo est exécuté et je reçois une System.ObjectDisposedException .

Comment appeler Close() sur le stream de manière appropriée et éviter la perte de données?

Apparemment, le StreamWriter est déjà parti lorsque le destructeur de Foo s’exécute

Oui. A la fin du programme, en supposant que votre object soit GC’ed (rien ne le garantit), le moteur d’exécution ne fournit aucune garantie quant à l’ordre dans lequel il exécute les finaliseurs. Les deux objects étant inaccessibles et pouvant être finalisés simultanément, leur finaliseur peut donc être exécuté dans n’importe quel ordre.

Les finaliseurs ne sont là que comme protection contre le code buggy. Et ils ne sont pas fiables à 100% à cette fin non plus. C’est pourquoi vous devez travailler dur pour éviter le code buggy.

Vous aurez besoin d’une méthode déterministe pour disposer l’object singleton à la sortie du processus. Vous pouvez le placer dans le contrôle de la logique principale de votre programme, à savoir la durée de vie du processus, et lui demander de disposer du singleton (par exemple, via une méthode publique que vous écrivez à cette fin). Une autre solution consiste à s’abonner à l’événement AppDomain.ProcessExit dans le constructeur de votre singleton et à laisser le gestionnaire y fermer le singleton.

Voir ces questions connexes pour des informations supplémentaires:
Comment puis-je m’assurer que je dispose d’un object dans mon singleton avant la fermeture de l’application?
Singleton jetable en C #