По порядку Junior Потоки и синхронизация обновлено

Правильное использование SemaphoreSlim

Вопрос

Расставьте шаги асинхронной критической секции на SemaphoreSlim в правильном порядке.

Попробуйте сами

Расставьте шаги по порядку стрелками.

  1. 1
    Создать SemaphoreSlim(1, 1) один раз как поле
  2. 2
    Выполнить работу с общим ресурсом (можно с await)
  3. 3
    await _gate.WaitAsync(ct) перед входом
  4. 4
    В finally вызвать _gate.Release()
  5. 5
    Открыть try
Показать ответ и разбор

Коротко

WaitAsync ставится до try: если ожидание отменят токеном, Release не должен вызваться, иначе счётчик семафора увеличится лишний раз. А Release в finally гарантирует освобождение при исключении в работе.

Правильный порядок

  1. 1
    Создать SemaphoreSlim(1, 1) один раз как поле
  2. 2
    await _gate.WaitAsync(ct) перед входом
  3. 3
    Открыть try
  4. 4
    Выполнить работу с общим ресурсом (можно с await)
  5. 5
    В finally вызвать _gate.Release()

Разбор

WaitAsync ставится до try: если ожидание отменят токеном, Release не должен вызваться, иначе счётчик семафора увеличится лишний раз. А Release в finally гарантирует освобождение при исключении в работе.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме