web-dev-qa-db-ja.com

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

使用する前にawaitが追加され、コードが正常にコンパイルされます。それは何を意味し、いつそれを行う必要がありますか?

12
Uriil

using (...)IDisposeを使用してリソースをクリーンアップするのと同様に、await using (...)IAsyncDisposable を使用します。これにより、ブロックせずにクリーンアップ時に時間のかかるタスク(I/Oなど)を実行することもできます。

21
Klaus Gütter

SqlConnectionIAsyncDisposableインターフェースを実装している場合、Resharperはawait usingに切り替えて、DisposeAsyncmethod

public interface IAsyncDisposable
{
    ValueTask DisposeAsync();
}
5