首页 > 解决方案 > 如果后台线程中存在未处理的异常,如何使主进程崩溃

问题描述

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

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

订阅者是嵌入在 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}。

是否有任何其他配置,例如,可以设置控制是否使主进程崩溃?

标签: c#multithreadingcombackground-thread

解决方案


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


推荐阅读