Если вы передаёте тип значения, он будет заблокирован, и в следующий раз, когда код будет выполняться здесь, он снова будет в коробке, и это не будет один и тот же объект дважды, поэтому его нельзя заблокировать
Замок(x)
{ ...
}
Блокировка фактически осуществляется через объект Monitor:
Вышеуказанное эквивалентно:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); Попробуй
{ ...
} наконец
{ System.Threading.Monitor.Exit(obj);
}
Затем процитирую оригинальные слова MSDN: Используйте Monitor для блокировки объектов (то есть типов ссылок), а не для типов значений. Когда вы передаёте переменную типа значения в Enter, она появляется как объект. Если вы снова передаёте ту же переменную в Enter, она попадает в отдельный объект, и поток не блокируется. В данном случае код, который Monitor якобы защищает, не защищён. Кроме того, при передаче переменной в Exit создаётся ещё один отдельный объект. Поскольку объект, переданный в Exit, отличается от объекта, переданного в Enter, Monitor выдает SynchronizationLockException. Для получения дополнительной информации смотрите концептуальную тему Мониторы. |