我正在考虑使用ConcurrentDictionary
来保存一些来自慢速源(例如数据库)的缓存数据。
对数据库的调用是async
。那么,如果项目不存在于字典中,是否可以让并发字典调用异步方法?
例如:
const int userId = 1;
var cachedUsers = new ConcurrentDictionary<int, Task<User>>();
var user = await cachedUsers.GetOrAdd(userId, val => GetSlowDbResultAsync(userId, cancellationToken));
所以上面的pseduo代码试图做的是:
所以 - 将Task<User>
放入并发字典的值&#39; (对于键/值):
注意:
这个问题是inspired from my question on twitter 这类似于previous question I asked,但并没有太大的吸引力。
答案 0 :(得分:-4)
如何尝试编写扩展方法,例如:
class Extension
{
public static User Get(this ConcurrentDictionary<int, User> conDict, int userID)
{
User user = null;
if (!conDict.TryGetValue(userID, out user))
{
user = GetSlowDbResultAsync(userId, cancellationToken)
conDict.TryAdd(userID, user);
}
return user;
}
}
有关扩展方法的详情,请查看此article。