gpt4 book ai didi

async-await - Resharper 建议将 Using 语句转换为单个 "await Using"?

转载 作者:行者123 更新时间:2023-12-04 14:35:37 25 4
gpt4 key购买 nike

Resharper 建议将带有 await 关键字的 using 语句改进为单行 await using 语句。例如,以下代码片段:

    private async Task<string> ReadResponseAsync(HttpContext context)
{
var originalBody = context.Response.Body;

try
{
using (var responseStream = new MemoryStream())
{
context.Response.Body = responseStream;
await _next(context).ConfigureAwait(false);

var response = context.Response;
response.Body.Seek(0, SeekOrigin.Begin);

using (var responseReader = new StreamReader(response.Body))
{
var responseContent = await responseReader
.ReadToEndAsync()
.ConfigureAwait(false);

response.Body.Seek(0, SeekOrigin.Begin);

await responseStream.CopyToAsync(originalBody)
.ConfigureAwait(false);
return responseContent;
}
}
}
finally
{
context.Response.Body = originalBody;
}
}

在应用连续的 Resharper 建议后,代码变为以下内容:
    private async Task<string> ReadResponseAsync(HttpContext context)
{

var originalBody = context.Response.Body;

try
{
await using var responseStream = new MemoryStream();
context.Response.Body = responseStream;
await _next(context).ConfigureAwait(false);

var response = context.Response;
response.Body.Seek(0, SeekOrigin.Begin);

using var responseReader = new StreamReader(response.Body);
var responseContent = await responseReader
.ReadToEndAsync()
.ConfigureAwait(false);

response.Body.Seek(0, SeekOrigin.Begin);

await responseStream.CopyToAsync(originalBody)
.ConfigureAwait(false);
return responseContent;
}
finally
{
context.Response.Body = originalBody;
}
}

这两个代码片段相似吗?这里实际上正在改进什么?我不理解 C# 使用语句的这个特性。

最佳答案

当您接受该建议时,有两件事发生了变化:

  • await using ,您可以在实现新 IAsyncDisposable 的类型上使用它.和普通的 using 一样,除了它调用 DisposeAsync()而不是 Dispose() .
  • 来自 using 的变化块,只是一个声明。此建议只是为了尽量减少代码中的嵌套。一旦对象超出范围,则 Dispose()/DisposeAsync()叫做。您可以在 the documentation 中阅读更多相关信息.

  • 这是两个独立的特性,您可以彼此独立使用(您可以将 await using 与块一起使用,或使用 using 作为声明),但两者都是该语言中的全新功能。

    关于async-await - Resharper 建议将 Using 语句转换为单个 "await Using"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58963122/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com