我想在发生未处理的异常时在问题跟踪器系统中创建错误报告。由于这是通过一系列异步http请求完成的,所以对应的方法是async return a task:
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 也卡住)。
您还可以将错误详细信息写入临时文件,重新启动应用程序并在应用程序启动时处理任何此类临时文件。
关于c# - AppDomain.CurrentDomain.UnhandledException 的异步事件处理程序的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52473887/