Задать вопрос
@oleg_ods

ReaderWriterLock VS await using?

Объясните, пожалуйста, поведение следующего блока кода:
var rwl = new ReaderWriterLockSlim();
		
		rwl.EnterWriteLock();
		
		try
		{
            await using var stream = new FileStream("1.txt", FileMode.Create);
			await using var writer = new StreamWriter(stream);
			await writer.WriteLineAsync("test");
			// здесь происходит выход из блокировки. Как так то?
		}
		finally
		{
			// SynchronizationLockException: The write lock is being released without being held
			rwl.ExitWriteLock();
		}


1. Почему снятие блокировки происходит в блоке try?
2. Почему такое поведение только при использовании await using?

Буду искренне благодарен за ссылку на документацию где можно почитать про это явление=)
  • Вопрос задан
  • 299 просмотров
Подписаться 3 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Учебный центр IBS
    SDP-030_PRG Продвинутая разработка в Microsoft .NET
    1 неделя
    Далее
  • Ulearn.me
    Проектирование на языке C#
    1 неделя
    Далее
  • Ulearn.me
    Основы программирования на примере C#. Часть 2
    1 неделя
    Далее
Решения вопроса 1
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Это LOCK!!!!
Никогда не используй асинхронный код внутри критической секции. Че случилось:
1. Поток 1 взял лок
2. Зашел в крит. секцию
3. await перенес тебя в другой поток (например, 2)
4. Поток 2 (новый) возвращает блокировку - НО ОН ЕЕ НЕ ДЕРЖИТ

Если не веришь - попробуй то же самое, но с помощью обычного lock { } сделать. Тебя компилятор поругает
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Smilleey
Перенесите первые две строки в try.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы