gpt4 book ai didi

c# - 阻塞函数调用的看门狗

转载 作者:行者123 更新时间:2023-12-02 15:45:27 25 4
gpt4 key购买 nike

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

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

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

最佳答案

一种方法可能是在 API 调用之前设置一个 System.Threading.Timer,以便在一定的超时间隔后触发,然后在调用完成后释放该 Timer。如果计时器触发,它将在 ThreadPool 线程上触发,然后您可以采取适当的操作来终止有问题的线程。

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

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

关于c# - 阻塞函数调用的看门狗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7046574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com