AppDomain.CurrentDomain.UnhandledException

时间:2018-09-24 06:41:53

标签: c#

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

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

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

替代

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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