【发布时间】:2011-12-10 02:57:00
【问题描述】:
这是一个带有构造函数的日志类:
public QFXLogger(
int maxFileSize,
TraceLevel logLevel)
{
this.maxFileSize = maxFileSize;
logSwitch.Level = logLevel;
//Configure log listener
traceListener = new FileLogTraceListener();
traceListener.DiskSpaceExhaustedBehavior = DiskSpaceExhaustedOption.DiscardMessages;
traceListener.CustomLocation = @".\Log";
traceListener.BaseFileName = "QFXLog";
traceListener.AutoFlush = true;
//Remove all other listeners
Trace.Listeners.Clear();
//Add QFX listener
Trace.Listeners.Add(traceListener);
//Write header
WriteSessionHeader();
}
这是破坏者:
~QFXLogger()
{
WriteSessionFooter();
traceListener.Close();
}
我只想在记录器获得 GC 之前向底层流写入页脚。 没有析构函数一切都很好,但有了它我得到以下信息:
Unhandled Exception: System.ObjectDisposedException: Cannot access a closed file
.
at System.IO.__Error.FileNotOpen()
at System.IO.FileStream.Flush(Boolean flushToDisk)
at System.IO.FileStream.Flush()
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.IO.StreamWriter.Flush()
at Microsoft.VisualBasic.Logging.FileLogTraceListener.ReferencedStream.CloseS
tream()
at Microsoft.VisualBasic.Logging.FileLogTraceListener.CloseCurrentStream()
at Microsoft.VisualBasic.Logging.FileLogTraceListener.Write(String message)
at System.Diagnostics.TraceInternal.Write(String message)
at System.Diagnostics.Trace.Write(String message)
at QFXShell.QFXLogger.WriteSessionFooter()
at QFXShell.QFXLogger.Finalize()
在我看来,底层流已经关闭了。
我怎样才能抑制这种关闭(基础流)或者这是另一个问题?
【问题讨论】:
-
@Ramhound WriteSessionFooter 除了这个之外什么都不做: Trace.Write(footerString);问题是我想在应用程序关闭之前写一个结束语句。
-
这个 ObjectDisposedException 在我的类的 IDisposable 接口实现中调用 Stream.Dispose() 时发生在我身上,但在我删除对 Stream.Flush() 的调用函数调用后停止发生。
-
糟糕,说得太早了。正如 Kelly Leahy 在他的网站上解释的那样,通过确保我的 Dispose(bool isFreeingManagedResources) 函数受到虚拟保护来解决了这个问题。以前,我将其设为私有。
标签: c# dispose destructor finalizer