【发布时间】:2019-11-20 20:46:49
【问题描述】:
Resharper 建议将带有 await 关键字的 using 语句改进为单行 await using 语句。例如,以下代码 sn -p :
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;
}
}
这两个代码 sn-ps 相似吗?这里实际上正在改进什么?对于 using 语句,我不理解 C# 的这一特性。
【问题讨论】:
-
这只是 C# 8 中引入的语法糖
-
await using适用于任何实现IAsyncDisposable的东西,它允许它有一个异步的 dispose 方法。 -
@Çöđěxěŕ 你是对的,这是使用异步一次性用品,也在 c# 8 中引入
-
@DetectivePikachu 当然是,但它们是两个不同的东西。第一个不会异步释放资源,第二个当然会,并且对 OP 更好;它使消费者能够在不阻塞主线程的情况下处理操作。
-
我说你是对的,你还需要什么?
标签: async-await resharper using c#-8.0