Запуск не более одного обновления
От: Слава  
Дата: 24.03.19 02:07
Оценка:
ASP.NET Core

Есть некий большой словарь, который берётся из стороннего вебсервиса.

Когда в ходе обработки запроса требуется найти ключ в этом словаре, можно поискать ключ, а если не нашёлся — то обновить словарь, обратившись к вебсервису. Если же и после этого не нашёлся — значит, есть несогласованность в данных возвращаем 500. Если словарь обновлялся меньше, чем t времени назад, то можно сразу возвращать 500, не обновляя его.

Словарь можно держать в MemoryCache, или в каком-то синглтоне. Но, если мы получили два или больше запроса, которые требуют обращения к словарю, если оба запроса не нашли ключ, то как ограничить количество одновременно запущенных запросов на обновление словаря?

Пока что я себе это представляю, как возврат некоего Task, который создаётся только одним запросом, а все остальные им пользуются, ожидая завершения. Или можно сделать некий выделенный тред с машиной состояний и очередью запросов вида "верни значение по ключу", который будет отвечать либо значением, либо ошибкой, либо будет держать запрос в очереди, пока словарь не обновится.

Но мне не нравится идея сразу городить отдельный тред, и обрабатывать всё руками, писать switch по состояниям (привет WndProc). Я подобное уже писал для работы с оборудованием, и больше не хочу.

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