Partager via


Programmation asynchrone

Les opérations asynchrones évitent de bloquer un thread pendant l’exécution de la requête dans la base de données. Les opérations asynchrones sont importantes pour conserver une interface utilisateur réactive dans les applications clientes riches et peuvent également augmenter le débit dans les applications web où ils libèrent le thread pour traiter d’autres demandes dans les applications web.

Après la norme .NET, EF Core fournit des équivalents asynchrones à toutes les méthodes synchrones qui effectuent des E/S. Ils ont les mêmes effets que les méthodes de synchronisation et peuvent être utilisés avec les mots clés C# async et await. Par exemple, au lieu d’utiliser DbContext.SaveChanges, qui bloque un thread pendant que les E/S de base de données sont effectuées, DbContext.SaveChangesAsync peut être utilisé :

var blog = new Blog { Url = "http://sample.com" };
context.Blogs.Add(blog);
await context.SaveChangesAsync();

Pour plus d’informations, consultez la documentation de programmation asynchrone C# générale.

Avertissement

EF Core ne prend pas en charge plusieurs opérations parallèles exécutées sur la même instance de contexte. Vous devez toujours attendre qu’une opération se termine avant de commencer l’opération suivante. Cela est généralement effectué à l’aide du mot clé await sur chaque opération asynchrone.

Avertissement

L’implémentation asynchrone de Microsoft.Data.SqlClient présente malheureusement des problèmes connus (par exemple, #593, #601, etc.). Si vous rencontrez des problèmes de performances inattendus, essayez d’utiliser l’exécution des commandes de synchronisation à la place, en particulier lorsque vous traitez de valeurs texte ou binaire volumineuses.

Remarque

EF Core transmet les jetons d’annulation au fournisseur de base de données sous-jacent en cours d’utilisation (par exemple, Microsoft.Data.SqlClient). Ces jetons peuvent être honorés ou pas. Consultez la documentation de votre fournisseur de base de données.

Opérateurs LINQ asynchrones

Pour prendre en charge l’exécution asynchrone de requêtes LINQ, EF Core fournit un ensemble de méthodes d’extension asynchrones qui exécutent la requête et retournent les résultats. Ces équivalents aux opérateurs LINQ standard et synchrones incluent ToListAsync, SingleAsync, AsAsyncEnumerable, etc. :

var blogs = await context.Blogs.Where(b => b.Rating > 3).ToListAsync();

Notez qu’il n’existe pas de versions asynchrones de certains opérateurs LINQ tels que Where ou OrderBy, car ils créent uniquement l’arborescence d’expressions LINQ et ne provoquent pas l’exécution de la requête dans la base de données. Seuls les opérateurs qui provoquent l’exécution des requêtes ont des équivalents asynchrones.

Important

Les méthodes d’extension asynchrone EF Core sont définies dans l’espace de noms Microsoft.EntityFrameworkCore. Cet espace de noms doit être importé pour que les méthodes soient disponibles.

Opérateurs LINQ asynchrones côté client

Dans certains cas, vous souhaiterez peut-être appliquer des opérateurs LINQ côté client aux résultats de retour de la base de données ; cela est nécessaire en particulier lorsque vous devez effectuer une opération qui ne peut pas être traduite en SQL. Dans ces cas, utilisez AsAsyncEnumerable pour exécuter la requête sur la base de données et poursuivez la composition des opérateurs LINQ du côté client sur le IAsyncEnumerable<T>résultant. Par exemple, la commande suivante exécute une fonction .NET locale sur les résultats asynchrones de la requête EF LINQ :

var blogs = context.Blogs
    .Where(b => b.Rating > 3) // server-evaluated (translated to SQL)
    .AsAsyncEnumerable()
    .Where(b => SomeLocalFunction(b)); // client-evaluated (in .NET)

await foreach (var blog in blogs)
{
    // ...
}

Remarque

Les opérateurs LINQ sur IAsyncEnumerable<T> ont été introduits dans .NET 10. Lorsque vous utilisez une version antérieure de .NET, référencez le package System.Linq.Async.