Оператор блокировки принимает mutex заданного объекта, выполняет блок операторов и затем освобождает блокировку. При удержании замка резьба, удерживающая замок, может захватить и снова отпустить замок. Любая другая тема блокируется и ждёт, пока замок будет освобождён.
Обзор:
Используйте код замка
Эквивалент
Можно предположить, что базовый код Lock реализован компанией Monitor.
Поскольку код использует попытку... Finalblock, то есть даже если в теле блокировки есть исключение, блокировка освобождается.
Вы не можете использовать блокировку оператора ожидания в теле заявления.Вы не можете использовать его в теле заявленияждуОператорский замок。 Вы не можете использовать блокировку оператора ожидания в теле заявления. Вы не можете использовать блокировку оператора ожидания в теле заявления. Это предложение очень важно!
Документация:Вход по гиперссылке виден.
Я сам проверяю код,Используйте Задачу, чтобы захватить замок, и использовать Ожидание для блокировки, код следующий:
После нескольких исполнений следующего кода результат выполнения оказывается не таким, как ожидалось.
Почему? Если вы попробуете использовать ключевое слово await при попытке использовать ключевое слово await в блокировке, вы получите ошибку компиляции: unable waitit в теле оператора блокировки. Причина в том, что после завершения waitit метод может запускаться в другом потоке вместо потока (вызывающего поток) до ключевого слова await.lockkeywordТа же темаВставь замок и отпусти замок в замке。 Модифицируйте код, чтобы интуитивно видеть причину:
Получите идентификатор резьбы замка и идентификатор резьбы разблокировки,Очевидно, не в одной теме, поэтому замок нельзя успешно открыть, как показано на рисунке ниже:
Пробовал менять код, тестировал с помощью потоков, выполнял несколько раз, и всё работало как ожидалось, код выглядит следующим образом:
(Конец)
|