在.NET中处理非托管本机异常/崩溃

时间:2014-03-21 16:53:22

标签: .net multithreading exception exception-handling unmanaged

我有一个.NET应用程序,它在单独的线程中定期调用非托管方法(每5秒钟)。而这种方法有时会崩溃。我需要以某种方式处理这种情况。主要问题是我无法更改c ++非托管代码。

我尝试了不同的方法来处理此异常,但没有取得任何成功:

  1. 通常

    尝试{}     catch(Exception ex)     {}

  2. try {} catch {}
    

    2
         AppDomain.CurrentDomain.UnhandledException + = CurrentDomain_UnhandledException;

    3 System.Windows.Threading.Dispatcher.CurrentDispatcher.UnhandledException + = CurrentDispatcher_UnhandledException;

    4。  Application.Current.DispatcherUnhandledException + = Current_DispatcherUnhandledException;

    无论如何它只是默默地崩溃。

    逻辑上应该重新启动此线程,但我知道Thread.Abort()是一种不好的做法。这种情况的最佳做法是什么?

    提前致谢。

1 个答案:

答案 0 :(得分:4)

如果非托管代码崩溃了您的流程,那么您将失去运气。没有异常传播到托管代码。对这种崩溃进行稳定的唯一方法是在一个单独的进程中启动非托管代码,而不仅仅是一个线程。您可以根据需要使用进程间通信来交换数据,并在崩溃时重新启动该进程。

此外,Thread.Abort不仅是一种不好的做法 - 当线程在非托管代码中时,它也无法帮助您,例如当非托管代码挂起时#34;。 Thread.Abort只允许在线程退出托管代码时中止该线程。