我遇到了一个奇怪的行为,我的C#应用程序。单线程和无递归C#中的奇怪死锁
我正在通过VS2010以调试模式运行应用程序,几个小时后应用程序只是等待一个锁释放,但唯一活着的线程是等待锁释放并且没有递归的该函数:
class ProductionNode {
private readonly object _lock = new object();
public bool Activate(long jobId)
{
lock(_lock) // Doesn't go through here
{
return DAL.InsertJobIfNotExists(jobId)>0; //SQL PLAIN INSERT IF NOT EXIST COMMAND
}
}
public void HasJobs()
{
lock(_lock)
{
return DAL.HasProductionJobs();
}
}
}
同样,当我暂停使用VS2010使用该ProductionNode唯一线程应用程序是等待被释放的_lock对象中的一个。
为了清楚起见,应用程序可能会激活多个线程中的生产节点,但在发生死锁的给定场景中,VS只显示使用ProductionNode对象的单个线程,其他线程使用其他对象类型。
有什么建议吗?
干杯, 多伦
疯狂的猜测,但也许锁定一个对象,它不能'只读'? – 2011-04-27 08:05:56
这是代码中唯一一个获取该锁的代码?这部分代码对我来说看起来非常好。 – CodesInChaos 2011-04-27 08:07:19
@Dan锁定不会发生在引用本身上,而是发生在实例上。所以'只读'应该没有效果。 – CodesInChaos 2011-04-27 08:08:18