C# 8理解await using语法

147

我有以下方法:

public async Task<IEnumerable<Quote>> GetQuotesAsync()
{
    using var connection = new SqlConnection(_connectionString);

    var allQuotes = await connection.QueryAsync<Quote>(@"SELECT [Symbol], [Bid], [Ask], [Digits] FROM [QuoteEngine].[RealtimeData]");

    return allQuotes;
}

一切都很好,清晰明了,连接将在作用域结束时被处理。

但是resharper建议将其改为:

在作用域结束时处理连接

public async Task<IEnumerable<Quote>> GetQuotesAsync()
{
    await using var connection = new SqlConnection(_connectionString);

    var allQuotes = await connection.QueryAsync<Quote>(@"SELECT [Symbol], [Bid], [Ask], [Digits] FROM [QuoteEngine].[RealtimeData]");

    return allQuotes;
}

在使用代码之前添加await,代码将成功编译。这是什么意思,我们什么时候需要这样做呢?

2个回答

214
using (...) 使用 IDisposable 清理资源类似,await using (...) 使用 IAsyncDisposable。 这允许在清理时执行耗时任务(例如涉及 I/O),而不会阻塞。

2
еҪ“жҲ‘еҸҜд»ҘдҪҝз”Ёawait usingж—¶пјҢдҪҝз”Ёusingдјҡжңүд»Җд№ҲеҗҺжһңпјҹ - Overlord Zurg
7
使用 using 会调用 Dispose() 而不是 await DisposeAsync(),因此会在当前线程中造成不必要的阻塞。这取决于对象类型,差异有多不可取。 - Klaus Gütter

34

如果 SqlConnection 实现了 IAsyncDisposable 接口,Resharper 建议你使用 await using 来异步地使用 DisposeAsync 方法 进行释放。

public interface IAsyncDisposable
{
    ValueTask DisposeAsync();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接