Compartir a través de


Programación asincrónica

Las operaciones asincrónicas evitan bloquear un subproceso mientras se ejecuta la consulta en la base de datos. Las operaciones asincrónicas son importantes para mantener una interfaz de usuario con capacidad de respuesta en aplicaciones cliente enriquecidas y también pueden aumentar el rendimiento en las aplicaciones web donde liberan el subproceso para atender otras solicitudes en las aplicaciones web.

Después del estándar .NET, EF Core proporciona homólogos 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 async y await de C#. Por ejemplo, en lugar de usar DbContext.SaveChanges, que bloqueará un subproceso mientras se realiza la E/S de la 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, consulte los documentos generales de programación asincrónica de C#.

Advertencia

EF Core no admite varias operaciones paralelas que se ejecutan en la misma instancia de contexto. Siempre debe esperar a que se complete una operación antes de comenzar la siguiente operación. Normalmente, esto se hace mediante la palabra clave await en cada operación asincrónica.

Advertencia

La implementación asincrónica de Microsoft.Data.SqlClient desafortunadamente tiene algunos problemas conocidos (por ejemplo, #593, #601y otros). Si ve problemas de rendimiento inesperados, intente usar la ejecución de comandos de sincronización en su lugar, especialmente cuando se trate de valores binarios o texto grandes.

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 pueden o no respetarse: consulte la documentación del proveedor de bases de datos.

Operadores LINQ asincrónicos

Para admitir la ejecución de consultas LINQ de forma asincrónica, EF Core proporciona un conjunto de métodos de extensión asincrónicos que ejecutan la consulta y devuelven resultados. Estos homólogos del operador LINQ estándar y sincrónico 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, ya que estos 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ónica de EF Core se definen en el espacio de nombres Microsoft.EntityFrameworkCore. Este espacio de nombres debe importarse para que los métodos estén disponibles.

Operadores LINQ asincrónicos del lado cliente

En determinados casos, es posible que desee aplicar operadores LINQ del lado cliente a los resultados que regresan de la base de datos; esto es necesario especialmente cuando es necesario realizar una operación que no se pueda traducir a SQL. En estos casos, use AsAsyncEnumerable para ejecutar la consulta en la base de datos y siga escribiendo los operadores LINQ del lado del cliente en el IAsyncEnumerable<T> resultante. Por ejemplo, lo siguiente ejecuta una función .NET local en los resultados asincrónicos de la consulta LINQ de EF:

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)
{
    // ...
}

Nota

Los operadores LINQ sobre IAsyncEnumerable<T> se introdujeron en .NET 10. Al usar una versión anterior de .NET, haga referencia al paquete de System.Linq.Async.