在这种情况下使用
using
模式有意义吗?或者await
会自动处置该资源吗?
var payload = await new StreamReader(HttpContext.Request.Body).ReadToEndAsync();
不,为什么会这样?
看看整个 StreamReader API - 它不仅仅是“ReadToEnd” - 即使这样,如果您的代码将读取器重置到不同的位置并读取更多内容会怎样?
在许多用例中自动处理并主动破坏它完全违背了 StreamReader 的 API。
此外,它还会使异步方法的行为与非异步版本不同。
因此 - 不,它的处置确实没有意义,所以它没有。
始终将代码创建的流包装在
using() { ... }
或 try/finally
块中是有意义的,是的。但是,如果流不是由您的代码“创建”的,那么您不应该有义务处置或关闭它。
您可以轻松做到这一点:
using (StreamReader s = new StreamReader(HttpContext.Request.Body))
{
var payload = await s.ReadToEndAsync();
}
您正在使用await关键字通过StreamReader异步读取HttpContext.Request.Body的内容。这是在 C# 中处理异步 I/O 操作时的常见做法。您不需要添加 using 语句来显式处置 StreamReader。 wait 关键字将确保异步操作完成时完成必要的清理。