Существует ли способ протестировать, если текущий поток содержит монитор, соединяют объект? Т.е. эквивалент Thread.holdsLock в Java.
Спасибо,
Я не верю, что есть. Есть несколько уродливых хакерских приемов, например вызов Monitor.Wait (monitor, 0)
и перехват исключения SynchronizationLockException
, но это довольно ужасно (и теоретически может «поймать» импульс, который другой ждали нить).
Боюсь, я предлагаю вам переделать дизайн, чтобы он вам не понадобился.
РЕДАКТИРОВАТЬ: В .NET 4.5 это доступно с помощью Monitor.IsEntered
.
Соответствующая информация хранится в структуре SyncBlock, используемой средой CLR, и может быть просмотрена во время отладки, например, с помощью WinDbg + sos. Насколько мне известно, нет никакого способа получить информацию из управляемого кода, но это может быть возможно из небезопасного кода, предполагая, что вы можете каким-то образом (и надежным образом) получить указатель на соответствующие данные, используемые средой CLR.