代码中有一个关键部分,由两个函数调用来限定,分别是 Start()
和 End()
。它们使用一个 Monitor
来阻塞其他线程的执行。现在我的问题是,如果某个线程由于任何原因都没有调用 End()
,那么整个进程就会出现问题,因为每个线程都在等待这个 Monitor
被释放。
当然,我可以使用带有超时的 TryEnter
,这样我就不会永远等待,但这并不会释放被阻塞的 Monitor
,所以从此时开始,我的程序每次都会进入超时状态。
是否有一种方法,在给定超时时间后,从另一个线程中释放被阻塞的 Monitor
?
void Start(){ Monitor.Enter(obj); }
void End(){ Monitor.Exit(obj); }
编辑:
我们通过com互操作调用Excel,我们无法确保Excel进程总是如预期的那样工作。请注意这是一个网络应用程序,因此不能处理该情况是致命的。 Start()
在第一次调用时被调用,请求调用Excel函数,End()
在请求结束时被调用。Excel进程开始挂起的可能性始终存在。
编辑2: 我现在有了将ent锁所有者存储在变量中的想法,并且在死锁时,我可以杀死此线程。这会释放锁吗?
if (Monitor.TryEnter(excelLocker, 10000) == false)
{
excelOwner.Abort();
excelOwner = null;
}
else
{
excelOwner = Thread.CurrentThread;
}