我有一个由两个函数调用分隔的代码中的关键部分,如Start()
和End()
。他们在执行期间使用Monitor
来阻止其他线程。现在我的问题是,如果某个线程无论出于何种原因都不会拨打End()
,我的整个过程都会遇到麻烦,因为每个线程都在等待这个Monitor
的发布。从监视器的所有者的另一个线程释放锁
当然我可以使用TryEnter
超时,这样我就不会永久等待,但是这不会释放被阻止的Monitor
,所以我的程序每次都会从这个时间开始进入这个超时。
如果给定的超时结束,是否有办法从另一个线程释放阻塞Monitor
?
void Start(){ Monitor.Enter(obj); }
void End(){ Monitor.Exit(obj); }
编辑: 我们通过COM调用Excel互操作,我们不能确保预期Excel进程将一直工作。请注意,这是一个Web应用程序,因此未能处理这种情况是致命的。 Start()
称为第一次,请求调用excel函数,End()
在请求结束时调用。 excel过程总是有可能开始挂起。
EDIT2: 我现在HDA的想法耳鼻喉科锁的所有者存储在变量和僵局,我可以杀了这个线程。这不会释放锁吗?
if (Monitor.TryEnter(excelLocker, 10000) == false)
{
excelOwner.Abort();
excelOwner = null;
}
else
{
excelOwner = Thread.CurrentThread;
}
为什么不在你的方法中设置一些简单的(...),直到达到某个阈值,然后在那一刻爆发? – 2011-02-03 17:17:32
不要试图修补代码中的错误。修复错误。 – 2011-02-03 17:24:53
@Hans Passant:这不是为了解决*我们的错误。我们通过com interop调用Excel,但我们无法确定Excel过程将始终按预期工作。请注意,这是一个Web应用程序,因此未能处理这种情况是致命的。 – codymanix 2011-02-03 17:35:26