gpt4 book ai didi

c# - ConcurrentDictionary GetOrAdd 异步

转载 作者:太空狗 更新时间:2023-10-30 00:47:51 25 4
gpt4 key购买 nike

我想将 GetOrAdd 之类的东西与 ConcurrentDictionary 一起用作网络服务的缓存。这本词典有异步版本吗? GetOrAdd 将使用 HttpClient 发出 Web 请求,因此如果有一个 GetOrAdd 是异步的词典版本就好了。

为了消除一些混淆,字典的内容将是对网络服务调用的响应。

ConcurrentDictionary<string, Response> _cache
= new ConcurrentDictionary<string, Response>();

var response = _cache.GetOrAdd("id",
(x) => { _httpClient.GetAsync(x).GetAwaiter().GetResponse(); });

最佳答案

GetOrAdd 不会成为异步操作,因为访问字典的值不是长时间运行的操作。

然而,您可以做的只是将任务存储在字典中,而不是具体化的结果。任何需要结果的人都可以等待该任务。

但是,您还需要确保该操作只启动一次,而不是多次。为了确保某些操作只运行一次,而不是多次,您还需要在 Lazy 中添加:

ConcurrentDictionary<string, Lazy<Task<Response>>> _cache = new ConcurrentDictionary<string, Lazy<Task<Response>>>();

var response = await _cache.GetOrAdd("id", url => new Lazy<Task<Response>>(_httpClient.GetAsync(url))).Value;

关于c# - ConcurrentDictionary GetOrAdd 异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54117652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com