AppDomain.CurrentDomain.UnhandledException的异步事件处理程序的解决方法



我想在发生未经处理的异常时在问题跟踪器系统中创建错误报告。由于这是通过一系列异步 http 请求完成的,因此相应的方法是异步返回任务:

AppDomain.CurrentDomain.UnhandledException += async (sender,eventArgs) => 
await CreateBugReport(eventArgs.ExceptionObject);

不幸的是,这不起作用,因为消息循环在所有 http 请求完成之前终止,并且 CreateBugReport 方法未完成。

另一种选择

AppDomain.CurrentDomain.UnhandledException += (sender,eventArgs) => 
CreateBugReport(eventArgs.ExceptionObject).Wait();

也不起作用,而是永远挂起(这是预期的行为(。

另一个约束是该方法CreateBugReport打开一个用于查询其他信息的对话框,因此它可能应该在 UI 线程中执行。

此问题的最佳解决方法是什么?

从评论来看,您的CreateBugReport似乎将向用户显示 UI。然而,Wait由于死锁而挂起,Task.Run不起作用,因为那里没有 UI 线程。

仅为该对话框创建第二个 UI 线程(LongRunning任务应该有效。再次调用该新线程上的Application.Run,就好像它是您的 Main 方法一样。然后,可以延迟UnhandledException处理程序,直到第二个线程完成。

Hans Passant在评论中说这有点不安全,我同意。但这可能是一个简单而务实的解决方案,在实践中有效。如果创建错误报告的代码没有与崩溃的代码共享数据,我不明白为什么它不起作用。崩溃的代码保持冻结状态(并且 UI 也冻结(。

您还可以将错误详细信息写入临时文件,重新启动应用程序并在应用程序启动时处理任何此类临时文件。

相关内容

最新更新