Я рассматриваю использование ConcurrentDictionary
для хранения некоторых кэшированных данных, которые поступают из медленного источника (например, из базы данных).
Обращение к базе данных async
. Итак, возможно ли, чтобы параллельный словарь вызывал асинхронный метод, если элемент не существует в словаре?
Например:
const int userId = 1;
var cachedUsers = new ConcurrentDictionary<int, Task<User>>();
var user = await cachedUsers.GetOrAdd(userId, val => GetSlowDbResultAsync(userId, cancellationToken));
так что этот псевдокод выше пытается сделать, это сказать:
- существует ли пользователь № 1 в C-Dict?
- Да, хорошо, используйте это.
- Нет, возьмите пользователя №1 из БД и вставьте его в кеш.
Итак, поместив Task<User>
в «значение» параллельного словаря (для ключа/значения):
- это нормально?
- является ли код, который я написал выше, приемлемым использованием этого или я просто злоупотребил всем, что священно с помощью async/await/c#
Примечания:
Этот вопрос навеян моим вопросом в Твиттере.
Это похоже на предыдущий вопрос, который я задал , но не получил большой поддержки.
ConcurrentDictionary
? Надеюсь, вы не используете асинхронность, надеясь, что это ускорит работу. - person CodingYoshi   schedule 31.10.2017