我有一些用于查询该传感器的硬件传感器的闭源API。 API来自我通过C#interop使用的DLL。 API的功能是阻塞的。它们通常会返回错误值,但在某些情况下它们不会返回。
我需要能够检测到这种情况,并在这种情况下杀死被阻止的线程。如何在C#中完成?
他们被调用的线程是通过BackgroundWorker创建的。我正在寻找一个简单的看门狗来阻止函数调用,我可以在调用函数之前设置它,并在我回来时重置。应该坐在那里等我回来。如果我没有,它将杀死线程,以便1)API再次释放,我的应用程序的任何线程仍然闲逛,并做任何,如果它最终返回和2)我可以采取其他恢复措施,例如重新初始化API以继续使用它。
答案 0 :(得分:6)
一种方法可能是在API调用之后设置一个System.Threading.Timer,在一定的超时间隔后触发,然后在调用完成后处理Timer。如果Timer触发,它将在ThreadPool线程上触发,然后您可以采取适当的操作来终止有问题的线程。
请注意,您需要P / Invoke到Win32 TerminateThread API,因为如果您在非托管代码中被阻止,.NET的Thread.Abort()将无效。
另请注意,在强行终止线程之后,进程将处于安全状态非常不太可能,因为终止的线程可能持有同步对象,可能一直在改变共享内存国家或任何其他此类关键操作。由于终止它,其他线程可能会挂起,进程可能会崩溃,数据可能会被破坏,狗和猫可能会一起生活;没有办法确定会发生什么,但可能会很糟糕。如果可能,最安全的方法是将API的使用隔离到您通过某些远程通道进行通信的单独进程中。然后你可以按需杀死那个外部进程,因为杀死进程比杀死一个进程要安全得多。