Asynchrone programmering
Asynchrone bewerkingen voorkomen dat een thread wordt geblokkeerd terwijl de query wordt uitgevoerd in de database. Asynchrone bewerkingen zijn belangrijk voor het houden van een responsieve gebruikersinterface in uitgebreide clienttoepassingen en kunnen ook de doorvoer verhogen in webtoepassingen waar ze de thread vrijmaken om andere aanvragen in webtoepassingen te verwerken.
Volgens de .NET-standaard biedt EF Core asynchrone tegenhangers voor alle synchrone methoden die I/O uitvoeren. Deze hebben dezelfde effecten als de synchronisatiemethoden en kunnen worden gebruikt met de C#-async
en await
trefwoorden. In plaats van dbContext.SaveChanges te gebruiken, waardoor een thread wordt geblokkeerd terwijl database-I/O wordt uitgevoerd, kan DbContext.SaveChangesAsync worden gebruikt:
var blog = new Blog { Url = "http://sample.com" };
context.Blogs.Add(blog);
await context.SaveChangesAsync();
Voor meer informatie, zie de algemene asynchrone programmeerdocumenten voor C#.
Waarschuwing
EF Core biedt geen ondersteuning voor het uitvoeren van meerdere parallelle bewerkingen op dezelfde contextinstantie. U moet altijd wachten totdat een bewerking is voltooid voordat u de volgende bewerking start. Dit wordt meestal gedaan met behulp van het await
trefwoord voor elke asynchrone bewerking.
Waarschuwing
De asynchrone implementatie van Microsoft.Data.SqlClient heeft helaas enkele bekende problemen (bijvoorbeeld #593, #601en andere). Als u onverwachte prestatieproblemen ondervindt, kunt u in plaats daarvan de uitvoering van de synchronisatieopdracht gebruiken, met name wanneer u te maken hebt met grote tekst- of binaire waarden.
Notitie
EF Core geeft annuleringstokens door aan de onderliggende databaseprovider die wordt gebruikt (bijvoorbeeld Microsoft.Data.SqlClient). Deze tokens kunnen al dan niet worden gehonoreerd. Raadpleeg de documentatie van uw databaseprovider.
Asynchrone LINQ-operators
Om het uitvoeren van LINQ-query's asynchroon te ondersteunen, biedt EF Core een set asynchrone extensiemethoden waarmee de query wordt uitgevoerd en resultaten worden geretourneerd. Deze tegenhangers van de standaard, synchrone LINQ-operators zijn onder andere ToListAsync, SingleAsync, AsAsyncEnumerable, enzovoort:
var blogs = await context.Blogs.Where(b => b.Rating > 3).ToListAsync();
Houd er rekening mee dat er geen asynchrone versies van sommige LINQ-operators, zoals Where of OrderBy, zijn, omdat deze alleen de LINQ-expressiestructuur opbouwen en niet ertoe leiden dat de query wordt uitgevoerd in de database. Alleen operators die de uitvoering van queries veroorzaken, hebben asynchrone tegenhangers.
Belangrijk
De Asynchrone EF Core-extensiemethoden worden gedefinieerd in de Microsoft.EntityFrameworkCore
naamruimte. Deze naamruimte moet worden geïmporteerd om de methoden beschikbaar te maken.
Asynchrone LINQ-operators aan clientzijde
In bepaalde gevallen kunt u LINQ-operators aan clientzijde toepassen op resultaten die afkomstig zijn van de database; Dit is vooral nodig wanneer u een bewerking moet uitvoeren die niet kan worden vertaald naar SQL. Voor dergelijke gevallen gebruikt u AsAsyncEnumerable om de query uit te voeren op de database en door te gaan met het opstellen van LINQ-operators aan de clientzijde via de resulterende IAsyncEnumerable<T>. Met de volgende opdracht wordt bijvoorbeeld een lokale .NET-functie uitgevoerd op de asynchrone resultaten van de EF LINQ-query:
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)
{
// ...
}
Notitie
LINQ-operators via IAsyncEnumerable<T> zijn geïntroduceerd in .NET 10. Wanneer u een oudere versie van .NET gebruikt, verwijst u naar het System.Linq.Async
-pakket.