Programação assíncrona
As operações assíncronas evitam bloquear um thread enquanto a consulta é executada no banco de dados. As operações assíncronas são importantes para manter uma interface do usuário responsiva em aplicativos rich client e também podem aumentar a taxa de transferência em aplicativos Web, onde liberam o thread para atender outras solicitações em aplicativos Web.
Seguindo o padrão .NET, o EF Core fornece contrapartidas assíncronas para todos os métodos síncronos que executam E/S. Eles têm os mesmos efeitos que os métodos de sincronização e podem ser usados com as palavras-chave async
e await
do C#. Por exemplo, em vez de usar DbContext.SaveChanges, que bloqueará um thread enquanto a E/S do banco de dados é executada, DbContext.SaveChangesAsync pode ser usado:
var blog = new Blog { Url = "http://sample.com" };
context.Blogs.Add(blog);
await context.SaveChangesAsync();
Para obter mais informações, consulte os documentos gerais de programação assíncrona em C#.
Advertência
O EF Core não suporta várias operações paralelas sendo executadas na mesma instância de contexto. Deve sempre aguardar a conclusão de uma operação antes de iniciar a operação seguinte. Isso geralmente é feito usando a palavra-chave await
em cada operação assíncrona.
Advertência
A implementação assíncrona do Microsoft.Data.SqlClient infelizmente tem alguns problemas conhecidos (por exemplo, #593, #601 e outros). Se você estiver vendo problemas de desempenho inesperados, tente usar a execução de comando de sincronização, especialmente ao lidar com texto grande ou valores binários.
Observação
O EF Core passa tokens de cancelamento para o provedor de banco de dados subjacente em uso (por exemplo, Microsoft.Data.SqlClient). Esses tokens podem ou não ser reconhecidos - consulte a documentação do seu provedor de banco de dados.
Operadores LINQ assíncronos
Para dar suporte à execução assíncrona de consultas LINQ, o EF Core fornece um conjunto de métodos de extensão assíncrona que executam a consulta e retornam resultados. Essas contrapartes para os operadores LINQ síncronos padrão incluem ToListAsync, SingleAsync, AsAsyncEnumerable, etc.:
var blogs = await context.Blogs.Where(b => b.Rating > 3).ToListAsync();
Observe que não há versões assíncronas de alguns operadores LINQ, como Where ou OrderBy, porque eles apenas criam a árvore de expressões LINQ e não fazem com que a consulta seja executada no banco de dados. Apenas os operadores que causam a execução de consultas têm contrapartidas assíncronas.
Importante
Os métodos de extensão assíncrona do EF Core são definidos no namespace Microsoft.EntityFrameworkCore
. Esse namespace deve ser importado para que os métodos estejam disponíveis.
Operadores LINQ assíncronos do lado do cliente
Em certos casos, você pode querer aplicar operadores LINQ do lado do cliente aos resultados que voltam do banco de dados; isso é necessário, especialmente quando você precisa executar uma operação que não pode ser traduzida para SQL. Para esses casos, use AsAsyncEnumerable para executar a consulta no banco de dados e continue a compor os operadores LINQ do lado do cliente sobre o IAsyncEnumerable<T>resultante. Por exemplo, o seguinte executa uma função .NET local nos resultados assíncronos da consulta 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)
{
// ...
}
Observação
Os operadores LINQ com mais de IAsyncEnumerable<T> foram introduzidos no .NET 10. Ao usar uma versão mais antiga do .NET, consulte o pacote System.Linq.Async
.