我有以下記錄器狀類模式:抑制流的過早終結在.NET
public class DisposableClassWithStream : IDisposable
{
public DisposableClassWithStream()
{
stream = new FileStream("/tmp/file", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
writer = new StreamWriter(stream);
}
public void WriteLine(string s)
{
writer.WriteLine(s);
}
~DisposableClassWithStream()
{
Dispose();
}
private readonly object disposableLock = new object();
private bool isDisposed;
public void Dispose()
{
lock (disposableLock)
{
if (!isDisposed)
{
writer.Close();
stream.Close();
GC.SuppressFinalize(this);
isDisposed = true;
}
}
}
private FileStream stream;
private TextWriter writer;
}
和使用這個類一個非常簡單的代碼:
public static void Main(string[] args)
{
var t = new DisposableClassWithStream();
t.WriteLine("Test");
}
的代碼引發(非確定性) ,它們都是在.net和mono上的,ObjectDisposedException
,由於它試圖將緩衝區刷新到已經處置的stream
而由對象writer
的方法Close
引起。
據我所知,原因是GC
在writer
之前完成stream
。我如何更改班級模式以確保stream
未在writer
之前處理?
我累了在構造函數中使用GC.SuppressFinalize(writer)
,但我不確定它是不是太hacky。
編輯:
我想,以解決擺在首位有終結的問題。正如在問題開始時提到的那樣,該類用作記錄器,並且我想確保在關閉過程之前將writer
中的所有行都刷新到硬盤中。
爲什麼你需要保持流暢? –
只需刪除析構函數。那些不是非託管資源,他們有自己的終結者。 –
我編輯了這個問題,以明確爲什麼有一個終結者。 – houen