Я хотел бы начать с отправки Трассировочная каждый раз, когда нить собирается войти/оставить критическую секцию, а также каждый раз, когда он успешно приобретает замок. Используйте класс System.Diagnostics.Trace
.
Тогда вы должны быть способны определить из вашего вывода трассировки, в котором на самом деле есть блокировка.
Типичный код трассировки:
Trace.WriteLine("Acquiring lock - foo");
lock (foo)
{
Trace.WriteLine("Acquired lock - foo");
// Do some stuff
Trace.WriteLine("Releasing lock - foo");
}
Trace.WriteLine("Released lock - foo");
В зависимости от способа ваша программа структурирована, это не могло бы быть полезным, если не включать информацию о нити в трассировке, например:
Trace.WriteLine(string.Format("Thread {0} - Acquiring lock - foo",
Thread.CurrentThread.ManagedThreadId));
После вы выяснили, какая нить имеет замок, вы можете войти в отладчик и посмотреть, какая блокировка , ожидающая, а затем использовать тот же вывод трассировки, чтобы выяснить, wh o имеет прочее замок. В большинстве случаев в тупике участвуют два потока, и это позволит вам найти их обоих.
Какой замок они ждут? Что вы видите в столах вызовов? – SLaks