c# - 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 也被冻结)。
您还可以将错误详细信息写入临时文件,重新启动应用程序并在应用程序启动时处理任何此类临时文件。
推荐阅读
- python - 2个gps坐标之间的距离
- parsing - 使用 freeze_graph.py 时出现错误“input_graph_def.ParseFromString(f.read()) google.protobuf.message.DecodeError: Error parsing message”
- pandas - 如果某些列值不满足条件,如何删除行组?
- c# - 我可以在 .Net 5.0 中将请求正文作为字符串获取吗?
- oauth - Apache Superset 和 Auth0 返回“意外的关键字参数‘范围’”
- javascript - JavaScript 对象在源页面中的值与在控制台中的值不同
- reactjs - webpack.config 有一个未知属性“publicPath”
- python - 为什么解析 XML 文件会出错?
- powershell - 如何使用 PowerShell 获取目录和元数据的树状列表
- azure-devops - Azure 管道:ArtifactStagingDirectory 的内容