gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:39:46 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com