<分区>
我正在考虑使用 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 中?
- 是的,好的,使用它。
- 不,从 Db 中获取用户 #1 并将其保存在缓存中。
所以 - 通过将 Task<User>
进入并发字典的“值”(对于键/值):
- 可以吗?
- 我上面写的代码是否可以接受,或者我只是滥用了 async/await/c# 的所有神圣内容
注意事项:
本题为inspired from my question on twitter .
这类似于 previous question I asked但没有得到太多关注。