2

我有一个用于查询该传感器的硬件传感器的闭源 API。API 以 DLL 形式提供,我通过 C# 互操作使用。API 的功能是阻塞的。它们通常返回错误值,但在某些情况下它们不会返回。

我需要能够检测到这种情况并在这种情况下杀死被阻塞的线程。这如何在 C# 中完成?

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

4

1 回答 1

6

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

请注意,您需要 P/Invoke 到 Win32 TerminateThread API,因为如果您在非托管代码中被阻止,.NET 的 Thread.Abort() 将不起作用。

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

于 2011-08-12T21:49:44.557 回答