私には次の方法があります:
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が追加され、コードが正常にコンパイルされます。それは何を意味し、いつそれを行う必要がありますか?
using (...)
はIDispose
を使用してリソースをクリーンアップするのと同様に、await using (...)
は IAsyncDisposable を使用します。これにより、ブロックせずにクリーンアップ時に時間のかかるタスク(I/Oなど)を実行することもできます。
SqlConnection
がIAsyncDisposable
インターフェースを実装している場合、Resharperはawait using
に切り替えて、DisposeAsync
method
public interface IAsyncDisposable
{
ValueTask DisposeAsync();
}