Мое приложение блокируется на неопределенный срок при вызове lock ( obj )
, но в окне потоков нет других потоков, у которых вообще есть какой-либо код для просмотра. Разве это не нужно для того, чтобы была вовлечена другая нить? Почему он не появляется, и что может быть причиной его отсутствия?
Обновление: Думаю, я понял, что это вызвало. У меня был такой хакерский блок, при котором я бы Wait()
на ManualResetEvent
внутри двух замков. Проблема была в том, что мне нужно было снять эти блокировки перед ожиданием, чтобы другие потоки могли их использовать, поэтому я делал что-то вроде этого:
lock ( one ) {
lock ( two ) {
...
Monitor.Exit( two );
Monitor.Exit( one );
syncEvent.Wait();
Monitor.Enter( one );
Monitor.Enter( two );
}
}
На что я не рассчитывал, так это на то, что Monitor.Exit()
на самом деле уменьшает только внутренний счетчик рекурсии, и, возможно, метод вызывался из блока, который уже был синхронизирован; таким образом, замок на самом деле не был освобожден .
Я думаю, это была плохая идея для начала. С тех пор я только что переместил вызов на Wait()
за пределы заблокированных блоков, и теперь он, кажется, работает нормально.
Спасибо за понимание.
Хотя теперь, когда я думаю об этом, если метод вызывается из кода, синхронизированного на одной из блокировок, он все равно не будет освобожден, когда произойдет вызов Wait
. Поэтому я должен быть осторожен, чтобы никогда не вызывать это из синхронизированного блока, я думаю.