Подтвердить что ты не робот

Как проверить, поддерживает ли поток блокировку объекта в С#?

Есть ли способ проверить, поддерживает ли текущий поток блокировку монитора для объекта? То есть эквивалент Thread.holdsLock в Java.

Спасибо,

4b9b3361

Ответ 1

Я не верю, что есть. Есть громоздкие взлома, которые вы могли бы сделать, например, позвонить Monitor.Wait(monitor, 0) и поймать SynchronizationLockException, но это довольно ужасно (и теоретически "поймать" импульс, ожидаемый другим потоком).

Я предлагаю вам попробовать перепроектировать, чтобы вы этого не нуждались, я боюсь.

EDIT: в .NET 4.5 это доступно с помощью Monitor.IsEntered.

Ответ 2

Соответствующая информация хранится в структуре SyncBlock, используемой CLR, и может быть просмотрена во время отладки, например. WinDbg + sos. Насколько мне известно, нет способа получить информацию из управляемого кода, но это может быть возможно из небезопасного кода, предполагающего, что вы можете каким-то образом (и надежно) получить указатель на соответствующие данные, используемые CLR.