オブジェクトまたはオブジェクト自体への参照が変更されない限り、オブジェクトへの参照に対して Monitor.Enter が機能すると思いました。
これが私の単純なケースです。キューを持つ QueueManager というクラスがあります。このオブジェクト Queue を使用して、キューを操作する前に Monitor.Lock を使用してロックしています。キュー オブジェクトで Monitor.Lock を呼び出す簡単なテストを試みましたが、失敗しました。理由はありますか?
public class QueueManager
{
private List<ConversionJob> _jobQueue = new List<ConversionJob>();
public QueueManager()
{
}
public List<ConversionJob> Queue
{ get { return _jobQueue; } }
}
public class Main
{
private QueueManager qMgr = new QueueManager();
public Main()
{
try
{
Monitor.Enter(qMgr.Queue);
throw new Exception();
}
catch (Exception)
{
Monitor.Enter(qMgr.Queue);
}
}
}
これはデッドロックしません!! なぜデッドロックしないのか理解できません。ロックが取られているのではないかと疑ってこれを試したので、このテストコードを入れてみましたが、驚きました。