Как взять блокировку для аналогичного запроса на идентификатор пользователя в C #?

У меня есть функция, которая получает значение из API, а затем обновляет внутри кеша. Эта функция используется всеми пользователями, но я не хочу обновлять значение для кэширования несколько раз. как избежать множественной записи? как снять блокировки для нескольких пользователей (если это возможно)? если блокировка взята пользователем A, пользователь B не должен блокироваться и продолжать обновлять значение и брать собственную блокировку. Все запросы на A должны обновляться только один раз в кэш.

Void foo(Guid userId){
    bool isFound = GetfromCache(userId);
    if(!isFound)
     var val = GetValueFromAPI();
    UpdateInsideCache(val, userId); // Here we could have multiple requests updating the same entry, since it is high scale system ~ Assume 100 Million request per day.
}

person Pawan Kumar    schedule 21.09.2020    source источник
comment
Если блокировку взял пользователь А, то что должен делать пользователь Б?   -  person Theodor Zoulias    schedule 21.09.2020
comment
@TheodorZoulias Пользователь B также должен заблокировать и заблокировать только его запрос. не для других.   -  person Pawan Kumar    schedule 21.09.2020
comment
Если блокировку взял пользователь А, то пользователь Б заблокирован, то что делать пользователю С?   -  person Theodor Zoulias    schedule 21.09.2020