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

C# 程序崩溃后如何挂起所有线程?,c#,multithreading,exception,windows-error-reporting,C#,Multithreading,Exception,Windows Error Reporting,我有一个未处理的异常处理程序。它显示了一个漂亮的GUI,允许用户发送错误报告。用户甚至可以留下他们的姓名、电话号码和其他东西,我们的支持部门会给他们回电话。效果很好,外观很好,让客户不那么生气。不管怎样,从理论上讲 问题是,我的应用程序使用后台线程,而这些线程似乎并不关心是否在GUI线程(这很有意义)上引发了异常,而是继续工作。如果用户让“我的自定义异常处理程序”窗口保持打开足够长的时间,最终会弹出一个WER对话框,使它看起来像是错误处理程序本身崩溃了 我无法访问异常处理程序范围内的线程对象,因

我有一个未处理的异常处理程序。它显示了一个漂亮的GUI,允许用户发送错误报告。用户甚至可以留下他们的姓名、电话号码和其他东西,我们的支持部门会给他们回电话。效果很好,外观很好,让客户不那么生气。不管怎样,从理论上讲

问题是,我的应用程序使用后台线程,而这些线程似乎并不关心是否在GUI线程(这很有意义)上引发了异常,而是继续工作。如果用户让“我的自定义异常处理程序”窗口保持打开足够长的时间,最终会弹出一个WER对话框,使它看起来像是错误处理程序本身崩溃了

我无法访问异常处理程序范围内的线程对象,因此无法挂起它们。使线程对象全局可访问也不是一个解决方案。我现在的解决方法是使用类似于
Globals.crash=true的东西在我的异常处理程序中,并让我的线程方法在每次循环迭代时检查该属性。虽然不完美,但它可以将损害降至最低


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

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

如果您有未处理的线程,未知异常,您可以假设发生了任何事情,并且您的程序可能无法完成最简单的事情。例如,如果它已经消耗了所有可用的内存,那么你也不能发送错误报告,因为它可能需要内存分配。 一个好的方法是编写一个单独的小应用程序,只做错误报告。该应用程序可以从文件中提取要报告的详细信息。这样,您的未知异常处理程序将:

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

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

看看这个问题中的代码,您需要调整它,以便不挂起您的GUI线程和您启动的任何非后台线程,但它应该可以做到这一点


但是,更好的选择是尝试将错误报告GUI作为一个单独的进程启动,向其传递任何必需的信息,然后从未处理的异常处理程序中终止原始进程,而不是允许任何程序在潜在的损坏状态下运行。

如果该技巧足够有效,我会坚持下去。我想上个星期左右有一次讨论涉及到这个问题。让我看看我是否能找到那个链接。。。好的,这里是:这听起来是最好的方法。谢谢