Одна вещь, которую я бы посоветовал при обертывании блокировки, чтобы упростить шаблон «использования», - это включить в замок поле «опасное состояние»; прежде чем разрешить ввод кода в код, необходимо проверить состояние опасности. Если состояние опасности установлено, и код, который пытается войти в блокировку, не передал специальный параметр, говорящий, что он ожидает, что это может быть, попытка получить блокировку должна вызвать исключение. Код, который временно переводит защищенный ресурс в плохое состояние, должен установить флаг состояния опасности, сделать то, что необходимо сделать, а затем сбросить флаг состояния опасности после завершения операции и перехода объекта в безопасное состояние.
Если во время установки флага состояния опасности происходит исключение, блокировку следует снять, но флаг состояния опасности должен оставаться установленным. Это гарантирует, что код, который хочет получить доступ к ресурсу, обнаружит, что ресурс поврежден, вместо того, чтобы вечно ожидать снятия блокировки (что будет результатом, если не будет блоков «using» или «try-finally»). ).
Если блокируемой блокировкой является ReaderWriterLock, может оказаться удобным, чтобы получение блокировки «записи» автоматически устанавливало состояние опасности; к сожалению, для IDisposable, используемого блоком using
, нет способа определить, был ли блок завершен корректно или через исключение. Следовательно, я не знаю никакого способа использовать что-либо синтаксически, например, блок «using» для защиты флага «состояние опасности».