По порядку Junior Потоки и синхронизация обновлено
Правильное использование SemaphoreSlim
Вопрос
Расставьте шаги асинхронной критической секции на SemaphoreSlim в правильном порядке.
Попробуйте сами
Расставьте шаги по порядку стрелками.
- 1Создать
SemaphoreSlim(1, 1)один раз как поле - 2Выполнить работу с общим ресурсом (можно с
await) - 3
await _gate.WaitAsync(ct)перед входом - 4В
finallyвызвать_gate.Release() - 5Открыть
try
Показать ответ и разбор
Коротко
WaitAsync ставится до try: если ожидание отменят токеном, Release не должен вызваться, иначе счётчик семафора увеличится лишний раз. А Release в finally гарантирует освобождение при исключении в работе.
Правильный порядок
- 1Создать
SemaphoreSlim(1, 1)один раз как поле - 2
await _gate.WaitAsync(ct)перед входом - 3Открыть
try - 4Выполнить работу с общим ресурсом (можно с
await) - 5В
finallyвызвать_gate.Release()
Разбор
WaitAsync ставится до try: если ожидание отменят токеном, Release не должен вызваться, иначе счётчик семафора увеличится лишний раз. А Release в finally гарантирует освобождение при исключении в работе.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.