web-dev-qa-db-fra.com

La compréhension de C # 8 attend l'utilisation de la syntaxe

J'ai la méthode suivante:

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

Le tout fin et clair, la connexion sera supprimée en fin de champ.

Mais resharper suggère de le changer pour:

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

Il ajoute attendre avant d'utiliser et le code est compilé avec succès. Qu'est-ce que cela signifie et quand devons-nous le faire?

12
Uriil

Similaire à using (...) utilise IDispose pour nettoyer les ressources, await using (...) utilise IAsyncDisposable . Cela permet d'effectuer également des tâches chronophages (par exemple impliquant des E/S) lors du nettoyage sans blocage.

21
Klaus Gütter

Si SqlConnection implémente l'interface IAsyncDisposable, Resharper vous propose de passer à await using pour le supprimer de façon asynchrone en utilisant DisposeAsyncméthode

public interface IAsyncDisposable
{
    ValueTask DisposeAsync();
}
5
Pavel Anikhouski