程序崩溃后如何挂起所有线程?

时间:2010-08-20 19:46:53

标签: c# multithreading exception windows-error-reporting

我有一个未处理的异常处理程序。它显示了一个很好的GUI,并允许用户发送错误报告。用户甚至可以留下他们的姓名,电话号码和东西,我们的支持部门会回电话。效果很好,看起来不错,让客户不那么生气。理论上,无论如何。

问题是我的应用程序使用后台线程,并且线程似乎并不关心是否抛出异常,比如GUI线程(这是有意义的),并且只是继续他们的工作。如果用户让我的自定义异常处理程序窗口保持打开足够长的时间,那么最终会弹出WER对话框,使其看起来像错误处理程序本身崩溃。

我无法访问异常处理程序范围内的线程对象,因此我无法暂停它们。使线程对象全局可访问也不是解决方案。我现在的解决方法是在我的异常处理程序中使用类似Globals.Crashed = true;的东西,并让我的线程方法在每次循环迭代时检查该属性。不完美,但它最大限度地减少了伤害。

有没有人知道一种不那么黑客的方法?我的方法有误吗?我是否必须像WER那样做,并启动一个暂停主程序并显示错误UI的外部程序?

3 个答案:

答案 0 :(得分:5)

如果你有一个未处理的,未知的异常,你可以假设任何事情已经发生,你的程序可能无法做到最简单的事情。考虑例如它消耗了所有可用内存的情况 - 然后你也无法发送错误报告,因为它可能需要分配内存。

一种好的方法是编写一个单独的小应用程序,它只执行错误报告。该应用程序可以从文件中获取要报告的详细信息。那样你的未知异常处理程序就会:

  • 将信息转储到临时目录中的文件。
  • 以文件名作为参数启动错误报告应用程序。
  • 在它做一些愚蠢的事情之前终止失败的过程。

错误报告应用程序应删除临时文件。

答案 1 :(得分:0)

您可以跟踪全局Collection对象中的所有线程,这样当处理程序执行时,它可以简单地遍历集合对象并中止那里的线程。

答案 2 :(得分:0)

看一下这个问题中的代码Suspend Process in C#,你需要调整它,以便不挂起你的GUI线程和任何不是你已经开始的后台线程,但它应该诀窍。

然而,更好的选择是尝试将错误报告GUI作为一个单独的进程启动,将任何所需的信息传递给它,然后从未处理的异常处理程序中删除原始进程,而不是允许任何东西在潜在的腐败状态。