AC# 代码从 C++ dll 中检索属性值,此检索会阻塞当前线程,直到 dll 返回该值。在调试模式下,当检索需要很长时间时,MDA 会抛出一个 ContextDeadlockSwitch。
我想不可能在运行时捕获 ContextDeadlockSwitch,但是有没有办法让类似于 MDA 的机制可以抛出 C# 可以捕获的类似异常来检测这个死锁?
原因是让 C# 代码提示用户要么继续等待几秒钟,要么强行杀死并重新启动应用程序。
AC# 代码从 C++ dll 中检索属性值,此检索会阻塞当前线程,直到 dll 返回该值。在调试模式下,当检索需要很长时间时,MDA 会抛出一个 ContextDeadlockSwitch。
我想不可能在运行时捕获 ContextDeadlockSwitch,但是有没有办法让类似于 MDA 的机制可以抛出 C# 可以捕获的类似异常来检测这个死锁?
原因是让 C# 代码提示用户要么继续等待几秒钟,要么强行杀死并重新启动应用程序。
您可以在不同的线程中执行对 C++ dll 的调用,使用 ManualResetEvent上的超时等待来表示完成;如果达到超时,您可以询问用户是否要继续。请注意,如果 DLL 的 COM 对象位于 STA 中,您可能需要在为其保留的单元中创建该对象并进行编组,以防止它在外出吃午饭时冻结您的 GUI 线程。