程序崩溃后如何暂停所有线程?
-
30-09-2019 - |
题
我有一个未经治疗的例外处理程序。它显示了一个不错的GUI,并允许用户发送错误报告。用户甚至可以留下他们的姓名,电话号码和东西,我们的支持部门给他们回电。效果很好,看起来不错,使客户不太生气。从理论上讲,无论如何。
问题在于我的应用程序使用背景线程,并且线程似乎不在乎是否抛出了例外,例如GUI线程(这很有意义),然后继续进行工作。如果用户允许我的自定义异常处理程序保持足够长的时间,则最终会导致弹出一个WER对话框,使其看起来像错误处理程序本身崩溃了。
我无法访问异常处理程序范围中的线程对象,因此我无法暂停它们。使线程对象在全球范围内访问也不是解决方案。我现在的解决方法是使用类似 Globals.Crashed = true;
在我的例外处理程序中,请让我的线程方法检查每个循环迭代中的属性。并不完美,但可以最大程度地减少伤害。
有人知道一种不太黑的方法吗?我的方法错了吗?我是否必须像WER一样进行此操作,并启动一个暂停主程序并显示错误UI的外部程序?
解决方案
如果您有一个未知的,未知的例外,则可以假设任何事情都发生了,并且您的程序甚至可能无法做最简单的事情。考虑到它已经消耗了所有可用内存的情况 - 那么您也将无法发送错误报告,因为它可能需要分配内存。
一个好方法是写一个 分离 仅执行错误报告的小型应用程序。该应用程序可以从文件中获取详细信息。这样,您未知的异常处理程序就会:
- 将信息转移到临时目录中的文件中。
- 以文件名作为参数启动错误报告应用程序。
- 终止失败的过程,然后才能做些愚蠢的事情。
临时文件应通过错误报告应用程序删除。
其他提示
您可以在全局集合对象中跟踪所有线程,以便当您的处理程序执行时,它可以简单地遍历收集对象并中止此处的线程。
看这个问题中的代码, 在C#中暂停过程, ,您需要对其进行调整,以免暂停您的GUI线程,而不是您启动的任何背景线程,但它应该可以解决问题。
但是,更好的选择是尝试启动您的错误报告GUI作为一个单独的过程,将任何必需的信息传递给它,然后从您的未经手的异常处理程序中杀死原始过程,而不是让任何事情都以潜在损坏的状态运行。