从IFlurlClientFactory升级到IFlurlClientCache:是否需用using包裹GetOrAdd()?
问题解答
核心结论
绝对不能用using包裹从IFlurlClientCache获取的FlurlClient——这就是你并发请求失败的根本原因。
原因分析
IFlurlClientCache的核心设计目标是复用客户端实例,GetOrAdd方法返回的是缓存池里的共享实例,不是临时创建的一次性对象。你用using包裹它,会在代码块结束时强制调用Dispose释放客户端,导致后续并发请求从缓存拿到的是已被释放的失效实例,自然无法正常发送请求。
关于客户端释放的疑问
完全不需要手动处理未使用客户端的释放:
IFlurlClientCache会自动管理客户端的生命周期,后台会定期清理长时间未被使用的客户端实例,并释放其占用的资源。- 连续快速调用场景下,活跃的客户端会被缓存保留,确保复用效率,不会出现“在再次使用前被释放”的问题。
修正后的代码示例
public class FlurlHttpClient { private IFlurlClientCache ClientCache { get; set; } public FlurlHttpClient(IFlurlClientCache clientCache) => ClientCache = clientCache; public async Task<string> DoCall() // 补充async修饰符,匹配内部await调用 { ... var client = ClientCache.GetOrAdd("ExampleHostName", "http://example.host.com/api"); ... var httpResponse = await client.SendAsync ( new FlurlRequest { Content = content, Url = url, Verb = request.HttpMethod, } ); ... } }
内容的提问来源于stack exchange,提问作者Colin Campbell
相关产品推荐
相关产品推荐

