Есть некий большой словарь, который берётся из стороннего вебсервиса.
Когда в ходе обработки запроса требуется найти ключ в этом словаре, можно поискать ключ, а если не нашёлся — то обновить словарь, обратившись к вебсервису. Если же и после этого не нашёлся — значит, есть несогласованность в данных возвращаем 500. Если словарь обновлялся меньше, чем t времени назад, то можно сразу возвращать 500, не обновляя его.
Словарь можно держать в MemoryCache, или в каком-то синглтоне. Но, если мы получили два или больше запроса, которые требуют обращения к словарю, если оба запроса не нашли ключ, то как ограничить количество одновременно запущенных запросов на обновление словаря?
Пока что я себе это представляю, как возврат некоего Task, который создаётся только одним запросом, а все остальные им пользуются, ожидая завершения. Или можно сделать некий выделенный тред с машиной состояний и очередью запросов вида "верни значение по ключу", который будет отвечать либо значением, либо ошибкой, либо будет держать запрос в очереди, пока словарь не обновится.
Но мне не нравится идея сразу городить отдельный тред, и обрабатывать всё руками, писать switch по состояниям (привет WndProc). Я подобное уже писал для работы с оборудованием, и больше не хочу.