使用using接收BuildRequest返回的HttpRequestMessage能否正确释放资源?
问题解答
结论
你当前的写法可以正确释放HttpRequestMessage实例,只要其他逻辑没有额外持有相关对象的引用,数万次请求也不会因为这个资源释放逻辑出现内存泄漏。
具体原因
- 你的基类和子类
BuildRequest方法全程只创建了一个HttpRequestMessage实例:基类方法中new出实例后,子类只是拿到该实例的引用添加授权头,没有生成新的实例,最终返回给业务代码的就是这个唯一的实例。 - 业务代码中使用的C# 8.0+ using声明语法,会在当前代码块执行完成后,自动调用
HttpRequestMessage的Dispose方法完成非托管资源释放,符合IDisposable类型的标准释放规则。 HttpRequestMessage的内置Dispose逻辑会自动释放其关联的HttpContent属性对象,不需要你额外手动处理Content的释放。
额外注意点
你提供的子类重写代码存在语法问题,无法正常编译:基类的BuildRequest是同步方法,返回值为HttpRequestMessage,不能用async修饰重写方法,也不能对同步返回的结果加await。你可以把基类方法调整为异步签名protected virtual Task<HttpRequestMessage> BuildRequest(...),或者直接去掉子类方法的async和await关键字,直接调用基类方法即可。
内容的提问来源于stack exchange,提问作者Andrew Plank
相关产品推荐
相关产品推荐

