【发布时间】:2019-06-04 16:07:13
【问题描述】:
我想使用GetOrAdd 和ConcurrentDictionary 之类的东西作为Web 服务的缓存。这本词典有异步版本吗? GetOrAdd 将使用 HttpClient 发出 Web 请求,所以如果此字典有一个版本,其中 GetOrAdd 是异步的,那就太好了。
为了消除一些混乱,字典的内容将是对网络服务的调用的响应。
ConcurrentDictionary<string, Response> _cache
= new ConcurrentDictionary<string, Response>();
var response = _cache.GetOrAdd("id",
(x) => { _httpClient.GetAsync(x).GetAwaiter().GetResponse(); });
【问题讨论】:
-
对我来说,async
GetOrAdd听起来没有多大意义。该方法只能同步执行。 -
添加到字典不是 IO 绑定操作,它的异步版本没有意义。
-
如果您需要等待某些东西,我建议检查密钥是否在字典中,如果没有,则等待 Http 调用,然后调用
GeOrAdd并返回结果。最终,您必须再次检查,以防在您等待 IO 时有其他东西插入了密钥。 -
@juharr:这正是
ConcurrentDictionary所做的。它首先检查,然后生成一个新值,然后在添加之前再次检查。
标签: c# .net asynchronous concurrency concurrentdictionary