@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?

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

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

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

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