Re: SemaphoreSlim(1, 1) WaitAsync 2 -- пару вопросов.
От: karbofos42 Россия  
Дата: 30.12.20 01:10
Оценка: 14 (1)
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте.


S>Поигрался с примером из предыдущего вопроса
Автор: #John
Дата: 28.12.20
.


S>1) Почему balance не будет биться ( != 0), если в коде Add\Remove заменить Task на void?

S>Использую корректную версия кода, где вместо Factory использую Task.Run.
...
S>async void -- какая-то инфернальная конструкция.

Потому что async void никто не ждёт и про особенности таких методов куча информации в интернетах.
WhenAll устроит тот факт, что задачи дошли до своего первого await, т.е. эффект по сути тот же, что был в исходном вопросе

S>2)Почему SemaphoreSlim не бросает исключение, ведь захватить его может один поток, а освободить другой(continuation)?

S>Бегло посмотрел по исходникам, не похоже, чтобы runtime c контекстами возился и т.п.

потому что такое поведение у класса задокументировано

https://docs.microsoft.com/en-us/dotnet/api/system.threading.semaphoreslim?view=netframework-4.8

The SemaphoreSlim class doesn't enforce thread or task identity on calls to the Wait, WaitAsync, and Release methods. In addition, if the SemaphoreSlim(Int32) constructor is used to instantiate the SemaphoreSlim object, the CurrentCount property can increase beyond the value set by the constructor. It is the programmer's responsibility to ensure that calls to Wait or WaitAsync methods are appropriately paired with calls to Release methods.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.