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 cliente avançados e também podem aumentar a taxa de transferência em aplicativos Web em que eles liberam o thread para atender a outras solicitações em aplicativos Web.
Seguindo o padrão .NET, o EF Core fornece equivalentes assíncronos a 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
C#. Por exemplo, em vez de usar DbContext.SaveChanges, que bloqueará um thread enquanto a E/S do banco de dados for executada, DbContext.SaveChangesAsync poderá 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 do C#.
Aviso
O EF Core não dá suporte a várias operações paralelas que estão sendo executadas na mesma instância de contexto. Você sempre deve aguardar a conclusão de uma operação antes de iniciar a próxima operação. Isso normalmente é feito usando a palavra-chave await
em cada operação assíncrona.
Aviso
A implementação assíncrona de Microsoft.Data.SqlClient infelizmente tem alguns problemas conhecidos (por exemplo, #593, #601e outros). Se você estiver vendo problemas de desempenho inesperados, tente usar a execução síncrona de comandos, especialmente ao lidar com grandes valores de texto ou binários.
Nota
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 aceitos – consulte a documentação do seu provedor de banco de dados.
Operadores LINQ assíncronos
Para dar suporte à execução de consultas LINQ de forma assíncrona, o EF Core fornece um conjunto de métodos de extensão assíncrona que executam a consulta e retornam resultados. Esses equivalentes aos operadores LINQ padrão e síncronos incluem ToListAsync, SingleAsync, AsAsyncEnumerableetc.:
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 elas só criam a árvore de expressão LINQ e não fazem com que a consulta seja executada no banco de dados. Somente os operadores que causam a execução da consulta têm equivalentes assíncronos.
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 determinados casos, talvez você queira 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 o SQL. Para esses casos, use AsAsyncEnumerable para executar a consulta no banco de dados e continue a compor operadores LINQ no cliente sobre o IAsyncEnumerable<T> resultante. Por exemplo, o seguinte executa uma função .NET local nos resultados assíncronos da consulta LINQ do 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
Operadores LINQ em IAsyncEnumerable<T> foram introduzidos no .NET 10. Ao usar uma versão mais antiga do .NET, faça referência ao pacote System.Linq.Async
.