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

标签 c#

我想在发生未处理的异常时在问题跟踪器系统中创建错误报告。由于这是通过一系列异步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/

相关文章:

c# - 从 StreamSocket 读取时 DataReader 结果被截断

c# - 如何对某些 StyleCop 规则进行异常(exception)处理?

c# - 如何在 ASP.Net Blazor 服务器端使用 jCrop

c# - 使用 Autofac 返回不同范围内的不同组件

c# - 在 C# 的同一类中的另一个委托(delegate)函数中使用两个委托(delegate)函数的返回 View

c# - Greybox GB_showcenter 不显示弹出窗口

c# - SQL Server CE 没有从另一个进程中获取更新?

c# - Microsoft Graph - 无法以静默方式获取 token

c# - 忽略 selenium c# 中的页面加载

c# - 如何用 LinQ 对自定义对象求和?