当发生未处理的异常时,我想在问题跟踪器系统中创建错误报告。由于这是通过一系列异步http请求完成的,因此相应的方法是异步返回任务:
AppDomain.CurrentDomain.UnhandledException += async (sender,eventArgs) =>
await CreateBugReport(eventArgs.ExceptionObject);
不幸的是,这不起作用,因为消息循环在所有http请求完成且CreateBugReport方法未完成之前终止。
替代
AppDomain.CurrentDomain.UnhandledException += (sender,eventArgs) =>
CreateBugReport(eventArgs.ExceptionObject).Wait();
也不起作用,而是永久挂起(这是预期的行为)。
另一个限制是方法CreateBugReport
打开一个对话框以查询其他信息,因此它可能应该在UI线程中执行。
此问题的最佳解决方法是什么?
答案 0 :(得分:1)
从评论看来,您的CreateBugReport
将向用户显示UI。但是,Wait
由于死锁而挂起,Task.Run
无法工作,因为那里没有UI线程。
仅为该对话框创建另一个UI线程(LongRunning
任务应该起作用。再次在该新线程上调用Application.Run
,就好像它是您的Main方法一样。)。然后,您可以将UnhandledException
处理程序延迟到第二个线程完成为止。
Hans Passant在评论中说这有点不安全,我同意。但这可能是一个简单实用的解决方案,仅在实践中起作用。如果创建错误报告的代码没有与崩溃的代码共享数据,我不明白为什么它不起作用。崩溃的代码将保持冻结状态(UI也将冻结)。
您还可以将错误详细信息写入临时文件,重新启动应用程序,并在应用程序启动时处理任何此类临时文件。