Asynchronní programování
Asynchronní operace neblokují vlákno během provádění dotazu v databázi. Asynchronní operace jsou důležité pro zachování responzivního uživatelského rozhraní v bohatých klientských aplikacích a můžou také zvýšit propustnost webových aplikací, kde uvolní vlákno pro službu jiných požadavků ve webových aplikacích.
Po standardu .NET poskytuje EF Core asynchronní protějšky pro všechny synchronní metody, které provádějí vstupně-výstupní operace. Mají stejné účinky jako synchronizační metody a lze je použít s klíčovými slovy async
a await
jazyka C#. Například místo použití DbContext.SaveChanges, který bude blokovat vlákno při provedení vstupně-výstupní operace databáze, dbContext.SaveChangesAsync lze použít:
var blog = new Blog { Url = "http://sample.com" };
context.Blogs.Add(blog);
await context.SaveChangesAsync();
Další informace najdete v obecné dokumentaci k asynchronnímu programování jazyka C#.
Varování
EF Core nepodporuje spouštění více paralelních operací ve stejné instanci kontextu. Před zahájením další operace byste měli vždy počkat na dokončení operace. To se obvykle provádí pomocí klíčového slova await
pro každou asynchronní operaci.
Varování
Asynchronní implementace Microsoft.Data.SqlClient bohužel obsahuje některé známé problémy (např. #593, #601a další). Pokud dochází k neočekávaným problémům s výkonem, zkuste místo toho použít spuštění příkazu synchronizace, zejména při práci s velkými textovými nebo binárními hodnotami.
Poznámka
EF Core předává tokeny zrušení do používaného zprostředkovatele databáze (např. Microsoft.Data.SqlClient). Tyto tokeny mohou nebo nemusí být dodrženy – projděte si dokumentaci poskytovatele databáze.
Asynchronní operátory LINQ
Pro podporu asynchronního spouštění dotazů LINQ poskytuje EF Core sadu asynchronních rozšiřujících metod, které spouští dotaz a vrací výsledky. Mezi tyto protějšky standardních synchronních operátorů LINQ patří ToListAsync, SingleAsync, AsAsyncEnumerableatd.:
var blogs = await context.Blogs.Where(b => b.Rating > 3).ToListAsync();
Všimněte si, že neexistují žádné asynchronní verze některých operátorů LINQ, jako jsou Where nebo OrderBy, protože tyto pouze sestavují strom výrazů LINQ a nezpůsobí spuštění dotazu v databázi. Pouze operátory, které způsobují provádění dotazů, mají asynchronní protějšky.
Důležitý
Asynchronní metody rozšíření EF Core jsou definovány v oboru názvů Microsoft.EntityFrameworkCore
. Tento obor názvů musí být importován, aby byly dostupné metody.
Asynchronní operátory LINQ na straně klienta
V některých případech můžete chtít použít operátory LINQ na straně klienta na výsledky, které se vrátí z databáze; to je potřeba zejména v případě, že potřebujete provést operaci, která se nedá přeložit do SQL. V takových případech použijte AsAsyncEnumerable ke spuštění dotazu v databázi a pokračujte v vytváření operátorů LINQ na straně klienta ve výsledném IAsyncEnumerable<T>. Například následující příkaz spustí místní funkci .NET na asynchronních výsledcích dotazu 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)
{
// ...
}
Poznámka
Operátory LINQ pro IAsyncEnumerable<T> byly představeny v .NET 10. Pokud používáte starší verzi rozhraní .NET, odkazujte na balíček System.Linq.Async
.