Programación asincrónica
Las operaciones asincrónicas evitan bloquear un subproceso mientras la consulta se ejecuta en la base de datos. Las operaciones asincrónicas son importantes para mantener una interfaz de usuario con capacidad de respuesta en aplicaciones cliente enriqueciendo y también pueden aumentar el rendimiento en las aplicaciones web donde liberan el subproceso para dar servicio a otras solicitudes en aplicaciones web.
Siguiendo el estándar de .NET, EF Core equivalentes asincrónicos a todos los métodos sincrónicos que realizan E/S. Tienen los mismos efectos que los métodos de sincronización y se pueden usar con las palabras clave Y asyncawait de C#. Por ejemplo, en lugar de usar DbContext.SaveChanges, que bloqueará un subproceso mientras se realiza la E/S de base de datos, se puede usar DbContext.SaveChangesAsync:
var blog = new Blog { Url = "http://sample.com" };
context.Blogs.Add(blog);
await context.SaveChangesAsync();
Para obtener más información, vea la documentación general de programación asincrónica de C#.
Advertencia
EF Core no admite que varias operaciones en paralelo se ejecuten en la misma instancia de contexto. Siempre debe esperar que se complete una operación antes de iniciar la siguiente. Habitualmente, para esto se usa la palabra clave await en cada una de las operaciones asincrónicas.
Advertencia
La implementación asincrónica de Microsoft.Data.SqlClient desafortunadamente tiene algunos problemas conocidos (por ejemplo, #593, #601y otros).
Nota
EF Core pasa los tokens de cancelación al proveedor de base de datos subyacente en uso (por ejemplo, Microsoft.Data.SqlClient). Estos tokens se pueden respetar o no; consulte la documentación del proveedor de bases de datos.
Operadores de LINQ asincrónicos
Para admitir la ejecución asincrónica de consultas LINQ, EF Core proporciona un conjunto de métodos de extensión asincrónicos que ejecutan la consulta y devuelven resultados. Estos homólogos de los operadores LINQ estándar y sincrónicos incluyen ToListAsync,SingleAsync,AsAsyncEnumerable,etc.:
var blogs = await context.Blogs.Where(b => b.Rating > 3).ToListAsync();
Tenga en cuenta que no hay versiones asincrónicas de algunos operadores LINQ, como Where o OrderBy, porque solo compilan el árbol de expresiones LINQ y no hacen que la consulta se ejecute en la base de datos. Solo los operadores que provocan la ejecución de consultas tienen homólogos asincrónicos.
Importante
Los métodos de extensión asincrónicos de EF Core se define en el espacio de nombres Microsoft.EntityFrameworkCore. Es necesario importar este espacio de nombres para que los métodos estén disponibles.
Operadores LINQ asincrónicos del lado cliente
Los operadores linq asincrónicos mencionados anteriormente solo se pueden usar en consultas de EF: no se pueden usar con consultas de cliente LINQ to Objects cliente. Para realizar operaciones LINQ asincrónicas del lado cliente fuera de EF, use el paquete ;este paquete puede ser especialmente útil para realizar operaciones en el cliente que no se pueden traducir para su evaluación en el servidor.
En EF Core 6.0 y una versión inferior, la referencia desafortunadamente provoca errores ambiguos de compilación de invocación en operadores LINQ aplicados a DbSets de EF; esto dificulta el uso de EF y en el mismo System.Linq.AsyncSystem.Linq.Async proyecto. Para evitar este problema, agregue AsQueryable a DbSet:
var groupedHighlyRatedBlogs = await context.Blogs
.AsQueryable()
.Where(b => b.Rating > 3) // server-evaluated
.AsAsyncEnumerable()
.GroupBy(b => b.Rating) // client-evaluated
.ToListAsync();