Singleton a chiusura automatica StreamWriter

Ho provato a restringere ulteriormente il problema in Flush StreamWriter alla fine della sua vita implementando uno StreamWriter auto-chiudente simile a un 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’effetto desiderato è che in un programma di esempio come

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

il garbage collector fa chiudere l’istanza di Foo .

Questo non funziona . Apparentemente, StreamWriter è già andato quando viene eseguito il distruttore di Foo , e ottengo un System.ObjectDisposedException .

Come posso chiamare Close() sullo stream in modo appropriato e prevenire la perdita di dati?

Apparentemente, StreamWriter è già andato quando viene eseguito il distruttore di Foo

Sì. Al termine del programma, supponendo che il proprio object ottenga GC (non è garantito che lo sia), il runtime non fornisce alcuna garanzia circa l’ordine con cui esegue i finalizzatori. Entrambi gli oggetti sono irraggiungibili e possono essere finalizzati contemporaneamente, quindi i loro finalizzatori possono essere eseguiti in qualsiasi ordine.

I finalizzatori sono lì solo come un backstop per il codice buggato. E non sono nemmeno affidabili al 100% per questo scopo. È per questo che dovresti lavorare sodo per evitare il codice bug.

Avrai bisogno di un modo deterministico per disporre l’object Singleton all’uscita del processo. Puoi metterlo sotto il controllo della logica principale del tuo programma, che sta controllando la durata del processo, e disporne il singleton (ad esempio tramite un metodo pubblico che scrivi a tale scopo). Un’altra alternativa è iscriversi all’evento AppDomain.ProcessExit nel costruttore del singleton e fare in modo che il gestore chiuda il singleton.

Vedi queste domande correlate per ulteriori informazioni:
Come posso garantire di disporre di un object nel mio singleton prima che l’applicazione si chiuda?
Singleton monouso in C #