首页 > 解决方案 > 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 线程中执行。

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

标签: c#

解决方案


从评论看来,您CreateBugReport将向用户展示 UI。然而,Wait由于死锁而挂起并且Task.Run由于那里没有 UI 线程而无法工作。

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

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

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


推荐阅读