Aszinkron programozás
Az aszinkron műveletek elkerülik a szál blokkolását, amíg a lekérdezés végrehajtása az adatbázisban történik. Az aszinkron műveletek fontosak a rugalmas felhasználói felület gazdag ügyfélalkalmazásokban való megőrzéséhez, és növelhetik az átviteli sebességet a webalkalmazásokban is, ahol felszabadítják a szálat a webalkalmazások egyéb kéréseinek kiszolgálására.
A .NET szabványt követve az EF Core aszinkron megfelelőket biztosít az I/O-t végrehajtó összes szinkron metódushoz. Ezek hasonló hatásokat eredményeznek, mint a szinkronizálási módszerek, és a C# async
és await
kulcsszavakkal használhatók. Például a DbContext.SaveChanges használata helyett, amely blokkol egy szálat az adatbázis I/O-jának végrehajtása közben, a DbContext.SaveChangesAsync a következő módon használható:
var blog = new Blog { Url = "http://sample.com" };
context.Blogs.Add(blog);
await context.SaveChangesAsync();
További információért lásd: a C# aszinkron programozás általános dokumentumait.
Figyelmeztetés
Az EF Core nem támogatja, hogy több párhuzamos művelet fusson ugyanazon a környezeti példányon. A következő művelet megkezdése előtt mindig várnia kell a művelet befejezésére. Ez általában az egyes aszinkron műveletek await
kulcsszójának használatával történik.
Figyelmeztetés
A Microsoft.Data.SqlClient aszinkron implementációjának sajnos vannak ismert problémái (például #593, #601stb.). Ha váratlan teljesítménnyel kapcsolatos problémákat tapasztal, próbálkozzon inkább a szinkronizálási parancs végrehajtásával, különösen nagy szöveges vagy bináris értékek kezelésekor.
Jegyzet
Az EF Core átadja a lemondási jogkivonatokat a használatban lévő adatbázis-szolgáltatónak (pl. Microsoft.Data.SqlClient). Ezek a tokenek tiszteletben tarthatók vagy nem - kérjük, tekintse meg az adatbázis szolgáltatójának dokumentációját.
Async LINQ operátorok
A LINQ-lekérdezések aszinkron végrehajtásának támogatása érdekében az EF Core olyan aszinkron bővítménymetszet-metódusokat biztosít, amelyek végrehajtják a lekérdezést, és eredményeket adnak vissza. A szabványos, szinkron LINQ-operátorok megfelelői közé tartoznak a ToListAsync, SingleAsync, AsAsyncEnumerablestb.:
var blogs = await context.Blogs.Where(b => b.Rating > 3).ToListAsync();
Vegye figyelembe, hogy egyes LINQ-operátorok(például Where vagy OrderBy) aszinkron verziói nincsenek, mivel ezek csak a LINQ-kifejezésfát építik ki, és nem okozzák a lekérdezés végrehajtását az adatbázisban. Csak a lekérdezés végrehajtását okozó operátorok rendelkeznek aszinkron megfelelőkkel.
Fontos
Az EF Core aszinkron bővítmény metódusai a Microsoft.EntityFrameworkCore
névtérben vannak definiálva. Ezt a névteret importálni kell ahhoz, hogy a metódusok elérhetők legyenek.
Ügyféloldali aszinkron LINQ-operátorok
Bizonyos esetekben érdemes lehet ügyféloldali LINQ-operátorokat alkalmazni az adatbázisból származó eredményekre; erre különösen akkor van szükség, ha olyan műveletet kell végrehajtania, amely nem fordítható le AZ SQL-be. Ilyen esetekben a AsAsyncEnumerable használatával hajtsa végre a lekérdezést az adatbázisban, és folytassa az ügyféloldali LINQ-operátorok alkalmazását az eredményként kapott IAsyncEnumerable<T>-en. A következők például egy helyi .NET-függvényt hajtanak végre az EF LINQ-lekérdezés aszinkron eredményein:
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)
{
// ...
}
Jegyzet
A LINQ-operátorok a IAsyncEnumerable<T>-re lettek bevezetve a .NET 10-ben. A .NET régebbi verziójának használatakor hivatkozzon a System.Linq.Async
csomagra.