Как проверить, поддерживает ли поток блокировку объекта в С#?
Есть ли способ проверить, поддерживает ли текущий поток блокировку монитора для объекта? То есть эквивалент Thread.holdsLock в Java.
Спасибо,
Ответ 1
Я не верю, что есть. Есть громоздкие взлома, которые вы могли бы сделать, например, позвонить Monitor.Wait(monitor, 0) и поймать SynchronizationLockException, но это довольно ужасно (и теоретически "поймать" импульс, ожидаемый другим потоком).
Я предлагаю вам попробовать перепроектировать, чтобы вы этого не нуждались, я боюсь.
Соответствующая информация хранится в структуре SyncBlock, используемой CLR, и может быть просмотрена во время отладки, например. WinDbg + sos. Насколько мне известно, нет способа получить информацию из управляемого кода, но это может быть возможно из небезопасного кода, предполагающего, что вы можете каким-то образом (и надежно) получить указатель на соответствующие данные, используемые CLR.