Я попытался еще более сузить проблему в Flush StreamWriter at the end of its lifetime реализации одноэлементно типа Самозапирающийся 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
.
Это не работает. По-видимому, StreamWriter
уже исчез, когда работает деструктор Foo
, и я получаю System.ObjectDisposedException
.
Как я могу позвонить Close()
в потоке соответствующим образом и предотвратить потерю данных?
Я имею см референс-источник в компании Microsoft для FileStream. Когда вызывается деструктор, уже есть некоторый файл attemp для записи в файл, поэтому вам не нужно делать то, что вы сделали. Проблема в том, что GC уже может закрыть дескриптор файла до того, как произойдет последний сбой, поэтому он может не работать. Ссылка: http://referencesource.microsoft.com/#mscorlib/system/io/filestream.cs –
@ThariqNugrohotomo Вы имеете в виду код в 'FileStream.Dispose'? Я бы сказал, что 'Dispose' не вызывается в моем примере. – mkluwe