Здравствуйте.
Поигрался с примером из предыдущего
вопросаАвтор: #John
Дата: 28.12.20
.
1) Почему balance не будет биться ( != 0), если в коде Add\Remove заменить Task на void?
Использую корректную версия кода, где вместо Factory использую Task.Run.
static async void Add()
{
await s.WaitAsync();//.WaitAsync();
try
{
_balance++;
await Task.Yield();
}
finally
{
s.Release();
}
}
async void -- какая-то инфернальная конструкция.
2)Почему SemaphoreSlim не бросает исключение, ведь захватить его может один поток, а освободить другой(continuation)?
Бегло посмотрел по исходникам, не похоже, чтобы runtime c контекстами возился и т.п.