C#中await会自动释放StreamReader资源吗?

问题描述 投票:0回答:3

在这种情况下使用

using
模式有意义吗?或者
await
会自动处置该资源吗?

var payload = await new StreamReader(HttpContext.Request.Body).ReadToEndAsync();
c# .net async-await garbage-collection dispose
3个回答
0
投票

不,为什么会这样?

看看整个 StreamReader API - 它不仅仅是“ReadToEnd” - 即使这样,如果您的代码将读取器重置到不同的位置并读取更多内容会怎样?

在许多用例中自动处理并主动破坏它完全违背了 StreamReader 的 API。

此外,它还会使异步方法的行为与非异步版本不同。

因此 - 不,它的处置确实没有意义,所以它没有。


0
投票

始终将代码创建的流包装在

using() { ... }
try/finally
块中是有意义的,是的。但是,如果流不是由您的代码“创建”的,那么您不应该有义务处置或关闭它。

您可以轻松做到这一点:

using (StreamReader s = new StreamReader(HttpContext.Request.Body))
{
    var payload = await s.ReadToEndAsync();
}

-3
投票

您正在使用await关键字通过StreamReader异步读取HttpContext.Request.Body的内容。这是在 C# 中处理异步 I/O 操作时的常见做法。您不需要添加 using 语句来显式处置 StreamReader。 wait 关键字将确保异步操作完成时完成必要的清理。

© www.soinside.com 2019 - 2024. All rights reserved.