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