1

我正在使用自己的跟踪侦听器将消息输出到文件。为了获得良好的性能,我在 App.Config 中将 autoflush 设置为 false。所以我需要确保自己的底层缓冲区总是被刷新到磁盘,即使遇到意外/异常的程序终止,例如在调试时终止程序。我认为这可能是一个普遍的问题,有什么优雅的解决方案吗?

4

2 回答 2

1

不,没有简单的方法可以做到这一点。

您可以公开一个手动刷新缓冲区的方法。具体来说,当 .NET 应用程序因未处理的异常而崩溃时,您可以注册一个 AppDomain 处理程序。此处理程序可以调用缓冲区刷新方法。

但是,某些异常可能会或可能不会导致在域中执行未处理的异常处理程序。我相信它们是StackoverflowExceptionOutOfMemoryException而且ThreadAbortedException,也许还有其他一些特定于 CLR 本身的。

但在一般情况下,您应该在AppDomain::UnhandledException处刷新缓冲区。

当您故意终止应用程序时,我认为这不会刷新缓冲区。

于 2013-08-27T09:28:21.627 回答
0

使用析构函数创建对象。在析构函数中刷新。MSDN 说程序退出时会调用析构函数。如果您的程序崩溃,我仍在尝试找出这是否会起作用。

于 2013-08-27T09:22:06.980 回答