All streams
Search
Write a publication
Pull to refresh
0
0
Send message

Осталось понять зачем они сделали это изменение в Dictionary

Внутри лока да, но только если мы не залочимся на самом lock. Вот я про что
В обычном использовании он не доставит проблем, но lock есть lock.
Асинхронный метод по определению неблокирующий, а в нём есть блокировка и это меня как-то напрягает. Я не хочу сказать, что «всё х***я, давай по новой», но это может поставить в довольно неловкое положение пользователя этого метода.

Самый очевидный сценарий проблемного поведения: Мы начинаем долбить этот семафор многими потоками с огромной частотой, что приведёт нас к lock concoy, хотя этого мы никак не могли ожидать от асинхронного метода.
Скрытый текст
Если не ошибаюсь, то про что-то подобное рассказывал Евгений Пешков на DotNext Piter 2019
В реализации Microsoft есть конструкция lock, про которую я и говорил с:
Сокращённый отрывок исходного кода из исходников с github:
Код
Не получилось у меня отформатировать =(
Там Task, возвразающий bool, но хабр проглатывает скобочки .-.

public Task WaitAsync(int millisecondsTimeout, CancellationToken cancellationToken)
{//1
...
lock (m_lockObj)
{//2
if (m_currentCount > 0)
{//3
...
if (...) m_waitHandle.Reset();
return s_trueTask;
}//3
else
{//4
...
var asyncWaiter = CreateAndAddAsyncWaiter();
return (...) ?
asyncWaiter :
WaitUntilCountOrTimeoutAsync(...);
}//4
}//2
}//1

Я про то, что внутри async метода содержится lock, а никто не ожидает от async того, что он залочится и не продолжит выполнение. Ну и как и сказал gigavat38
Да, сразу не обратил внимания на это.
Меня смущает то, что async await сделаны, чтобы избегать блокировок и экономить на этом потоки, а они используются для блокировки -.-
Меня напрягает сам SemaphoreSlim.WaitAsync, который внутри себя явно вызывает lock, и лично мне наличие этого метода кажется весьма неоднозначным. Плюсом будет только то, что извне можно красивенько это принимать, но выдавать lock за Async.
Но зачем, если есть ReadWriteLock? И меня одного смущает async lock?

Information

Rating
Does not participate
Registered
Activity