你应该在 HttpClient 响应对象上调用 dispose 吗?

3

HttpClient没有被销毁或释放,因为它在多个调用之间被重复使用。

public async Task<HttpContent> DoSomething()
{
    var response = await _httpClient.PutAsync(url, content);

    return response.Content;
}

响应内容是否需要复制到其他位置,然后通过.Dispose()手动处理响应的HttpContent?如果需要,为什么?如果不需要,为什么?


3
可能是 Do HttpClient and HttpClientHandler have to be disposed? 的重复问题。 - Vivek Nuna
2个回答

2
一般规则是:始终调用实现了IDisposable接口的对象的Dispose方法。原因在于你永远不知道实现是否需要释放某些资源。
正如你可以在源代码中看到的,它确实会释放实际的流,因此你真的应该将其释放。
你可能想在接收方法中这样做。没有必要复制结果并立即调用dispose。
你可以像这样调用它,就像你习惯做的那样:
using (var r = await DoSomething())
{
}

它是一个流吗?因为我没有执行任何打开流连接并开始读取的操作。我本来期望它只是读取整个内容,这个过程会创建和处理流本身。另外,调用dispose是否意味着我的返回语句会返回“null”? - NibblyPig
由于它执行了 if (_contentReadStream != null),我本来以为通过读取整个内容,_contentReadStream 应该已经是 null 了。 - NibblyPig
如果你有那种亲密的了解,并且确信框架代码永远不会改变,那么可以将其省略。不过我还是宁愿保险一些。 - Patrick Hofman
2
阅读 https://dev59.com/WGUo5IYBdhLWcg3w3ymi ,这是错误的答案。 - Nicholas Petersen
首先,这个问题应该被关闭,因为它是一个重复的问题。不管怎样,也许我错了 Patrick,但是在SO上和其他数百人一样都是错的。对于这个已经被问过并回答过的问题,答案是:“普遍共识是你不需要(也不应该)释放HttpClient。许多深入了解其工作方式的人已经表明了这一点。”我不是说这是一个好的设计,在我看来它不是。HttpClient应该是全局使用的,我不同意这种设计,但它就是这样。 - Nicholas Petersen

2
当我使用.NET平台时,我总是遵循这个规则:当一个对象实现了IDisposable接口,我使用完对象后立即调用Dispose()方法。
为了不忘记调用Dispose()方法,我习惯使用using语句

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接