【问题标题】:how to crash the main process if there is unhandled exception inside background thread如果后台线程中存在未处理的异常,如何使主进程崩溃
【发布时间】:2019-01-27 10:43:00
【问题描述】:

我有一个发布者、调度者和订阅者。

发布者通过调度程序向订阅者发布事件。

subscriber 是一个嵌入在 S.exe 中的 com 对象,当特定事件来自 publisher.exe 时,可以从 dispatcher.exe 回调。

我预计订阅者内部的任何异常都会终止 S.exe。

我做了调查:

  1. 任务,与 配置可以终止主进程。相关文章, https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskscheduler.unobservedtaskexception?view=netframework-4.7.2

  2. 在我的代码中新建一个线程,无需任何具体配置即可 此外,线程内任何未处理的异常都可能使主线程崩溃 过程。相关文章, https://docs.microsoft.com/en-us/dotnet/standard/threading/exceptions-in-managed-threads

一个线程的两个属性:{isbackground, isThreadPoolThread}。

  1. 任务是{true, true}
  2. 人工线程是{true, false},
  3. 订阅者回调线程为 {true, false}。

有没有其他配置,比如,可以设置控制是否让主进程崩溃?

【问题讨论】:

  • 您必须以编程方式执行此操作,以便处理其他基本细节。超级傻瓜重要的是,您留下某种面包屑,以便用户可以发现程序终止的原因。您没有太多选择,因为您无法控制用户界面,System.Diagnostics.EventLog 就是您真正拥有的一切。然后 Environment.FailFast().

标签: c# multithreading com background-thread


【解决方案1】:

您可以处理AppDomain.CurrentDomain.UnhandledException 事件,在该事件中您可以使用Process.GetCurrentProcess() 获取当前进程并终止该进程,以便您的exe 将终止。

将此行Main() 放入Program.cs

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException

然后如下实现CurrentDomain_UnhandledException

private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    var currentProcess = Process.GetCurrentProcess();
    currentProcess.Kill();
}

这只是根据您的问题陈述的概念。您可以根据需要进行更改。

【讨论】:

  • 嗨,Ramoliya,实际上,这是我的主要功能,[STAThread] static void Main() { AppDomain.CurrentDomain.UnhandledException += (sender, args) => { MessageBox.Show(args. ExceptionObject.ToString()); }; TaskScheduler.UnobservedTaskException += (sender, args) => { MessageBox.Show(args.ToString()); }; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false);应用程序.运行(新 Form1); }
  • 所以您已经在处理UnhandledException 只需像这样在其中放置进程终止行。 AppDomain.CurrentDomain.UnhandledException += (sender, args) => { MessageBox.Show(args.ExceptionObject.ToString()); var currentProcess = Process.GetCurrentProcess(); currentProcess.Kill(); };
  • 问题出在我上面的附加代码中,我没有收到消息框。所以,我可以猜猜,它也不能用你建议的方式杀死我的进程吗?
【解决方案2】:

COM 中的任何异常都被 RCW 包装为 HRESULT 返回给它的客户端。 因此,当在 COM 线程中引发异常时,无法使主进程崩溃。

答案可能与: COM 方法通过返回 HRESULT 来报告错误; .NET 方法通过抛出异常来报告它们。运行时处理两者之间的转换。 .NET Framework 中的每个异常类都映射到一个 HRESULT。

来自https://docs.microsoft.com/en-us/dotnet/framework/interop/how-to-map-hresults-and-exceptions

和其他有用的链接: https://docs.microsoft.com/en-us/dotnet/framework/interop/runtime-callable-wrapper

https://docs.microsoft.com/en-us/dotnet/framework/interop/com-callable-wrapper

【讨论】:

    猜你喜欢
    • 2010-10-06
    • 2011-09-21
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多