C# 阻止函数调用的看门狗

C# 阻止函数调用的看门狗,c#,multithreading,watchdog,C#,Multithreading,Watchdog,我有一个用于查询某个硬件传感器的封闭源代码API。API作为DLL提供,我通过C#interop使用。API的函数正在阻塞。它们通常返回错误值,但在某些情况下不会返回 我需要能够检测到这种情况,在这种情况下杀死阻塞的线程。如何在C#中实现这一点 调用它们的线程是通过BackgroundWorker创建的。我正在寻找一个简单的看门狗来阻止函数调用,我可以在调用函数之前设置,并在我回来时重置。它应该坐在那里等我回来。如果我没有,它将终止线程,以便1)API再次被释放,应用程序的任何线程都不会继续挂起

我有一个用于查询某个硬件传感器的封闭源代码API。API作为DLL提供,我通过C#interop使用。API的函数正在阻塞。它们通常返回错误值,但在某些情况下不会返回

我需要能够检测到这种情况,在这种情况下杀死阻塞的线程。如何在C#中实现这一点


调用它们的线程是通过BackgroundWorker创建的。我正在寻找一个简单的看门狗来阻止函数调用,我可以在调用函数之前设置,并在我回来时重置。它应该坐在那里等我回来。如果我没有,它将终止线程,以便1)API再次被释放,应用程序的任何线程都不会继续挂起,如果它最终返回,我将执行任何操作;2)我可以采取其他恢复措施,如重新初始化API以继续使用它。

一种方法可能是在API调用之前设置System.Threading.Timer要在某个超时间隔后触发,请在调用完成后处理计时器。如果计时器触发,它将在线程池线程上触发,然后您可以采取适当的操作来杀死有问题的线程

请注意,您需要对Win32 TerminateThread API进行p/Invoke,因为如果在非托管代码中被阻止,.NET的Thread.Abort()将无法工作


还注意到,它是“强>非常/强”。在强制销毁线程后,您的进程不可能处于安全状态,因为终止的线程可能持有同步对象,可能处于共享内存状态的突变或任何其他此类关键操作中。终止它的结果是,其他线程可能挂起,进程可能崩溃,数据可能损坏,狗和猫可能开始生活在一起;没有办法确定会发生什么,但很可能会很糟糕。如果可能的话,最安全的方法是将API的使用隔离到一个单独的进程中,您可以通过一些远程通道与该进程通信。然后您可以根据需要终止外部进程,因为终止进程比终止线程安全得多。

回答得好。除了猫和狗生活在一起,当你杀死线程时,记忆也会泄漏。我喜欢你的建议,有一个单独的过程,可以杀死。这样的清理更自动化。+1:同意。分开处理是最好的办法。这很糟糕,但有时生活也是如此。分离过程的想法确实很好。它还可以避免我为x86构建整个托管应用程序,因为我只有32位版本的非托管DLL。(只是看看是否还有其他想法。)