C # 8理解等待使用语法

我有下一个方法:

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;
}

它在使用之前添加了等待,并且成功地编译了代码。这意味着什么? 我们什么时候需要这么做?

45483 次浏览

Similar as using (...) uses IDisposable to clean up resources, await using (...) uses IAsyncDisposable. This allows to perform also time-consuming tasks (e.g involving I/O) on cleanup without blocking.

If SqlConnection implements IAsyncDisposable interface, Resharper suggests you to switch to await using to dispose it asynchronously using DisposeAsync method

public interface IAsyncDisposable
{
ValueTask DisposeAsync();
}