Asynchrone ProgrammierungAsynchronous Programming

Asynchrone Vorgänge verhindern, dass ein Thread blockiert wird, während die Abfrage in der Datenbank ausgeführt wird.Asynchronous operations avoid blocking a thread while the query is executed in the database. Asynchrone Vorgänge sind wichtig, um eine reaktionsfähige Benutzeroberfläche in Rich Client-Anwendungen zu erhalten. Außerdem kann der Durchsatz in Webanwendungen erhöht werden, wo Sie den Thread für andere Anforderungen in Webanwendungen freigeben.Async operations are important for keeping a responsive UI in rich client applications, and can also increase throughput in web applications where they free up the thread to service other requests in web applications.

Nach dem .NET-Standard stellt EF Core asynchrone Entsprechungen für alle synchronen Methoden bereit, die e/a-Vorgänge ausführen.Following the .NET standard, EF Core provides asynchronous counterparts to all synchronous methods which perform I/O. Diese haben die gleichen Auswirkungen wie die Synchronisierungs Methoden und können mit den c# async -und- await Schlüsselwörtern verwendet werden.These have the same effects as the sync methods, and can be used with the C# async and await keywords. Anstatt z. b. dbcontext. SaveChanges zu verwenden, wodurch ein Thread blockiert wird, während die Datenbank-e/a-Vorgänge ausgeführt werden, kann dbcontext. savechangesasync verwendet werden:For example, instead of using DbContext.SaveChanges, which will block a thread while database I/O is performed, DbContext.SaveChangesAsync can be used:

var blog = new Blog { Url = "http://sample.com" };
context.Blogs.Add(blog);
await context.SaveChangesAsync();

Weitere Informationen finden Sie in der allgemeinen Dokumentation zur asynchronen Programmierung in c#.For more information, see the general C# asynchronous programming docs.

Warnung

EF Core unterstützt nicht die Ausführung mehrerer paralleler Vorgänge, die auf derselben Kontextinstanz ausgeführt werden.EF Core doesn't support multiple parallel operations being run on the same context instance. Sie sollten immer auf den Abschluss eines Vorgangs warten, bevor Sie den nächsten starten.You should always wait for an operation to complete before beginning the next operation. In der Regel erfolgt dies für alle asynchronen Vorgänge durch das Schlüsselwort await.This is typically done by using the await keyword on each async operation.

Hinweis

EF Core übergibt Abbruch Token an den verwendeten zugrunde liegenden Datenbankanbieter (z. b. Microsoft. Data. SqlClient).EF Core passes cancellation tokens down to the underlying database provider in use (e.g. Microsoft.Data.SqlClient). Diese Token werden möglicherweise nicht berücksichtigt. Informationen hierzu finden Sie in der Dokumentation des Datenbankanbieters.These tokens may or may not be honored - consult your database provider's documentation.

Asynchrone LINQ-OperatorenAsync LINQ operators

Um die asynchrone Ausführung von LINQ-Abfragen zu unterstützen, stellt EF Core einen Satz asynchroner Erweiterungs Methoden bereit, die die Abfrage ausführen und Ergebnisse zurückgeben.In order to support executing LINQ queries asynchronously, EF Core provides a set of async extension methods which execute the query and return results. Diese Entsprechungen zu den standardmäßigen synchronen LINQ-Operatoren umfassen "delistasync", "singleasync", "asasyncenenerable" usw.:These counterparts to the standard, synchronous LINQ operators include ToListAsync, SingleAsync, AsAsyncEnumerable, etc.:

var blogs = await context.Blogs.Where(b => b.Rating > 3).ToListAsync();

Beachten Sie, dass es keine asynchronen Versionen einiger LINQ-Operatoren gibt, wie z. b. WHERE oder OrderBy, da diese nur die LINQ-Ausdrucks Baumstruktur erstellen und nicht bewirken, dass die Abfrage in der Datenbank ausgeführt wird.Note that there are no async versions of some LINQ operators such as Where or OrderBy, because these only build up the LINQ expression tree and don't cause the query to be executed in the database. Nur Operatoren, die die Abfrage Ausführung bewirken, haben asynchrone EntsprechungenOnly operators which cause query execution have async counterparts.

Wichtig

Die asynchronen Erweiterungsmethoden von EF Core werden im Namespace Microsoft.EntityFrameworkCore definiert.The EF Core async extension methods are defined in the Microsoft.EntityFrameworkCore namespace. Dieser Namespace muss importiert werden, damit die Methoden verfügbar sind.This namespace must be imported for the methods to be available.

Client seitige asynchrone LINQ-OperatorenClient-side async LINQ operators

Die oben beschriebenen asynchronen LINQ-Operatoren können nur für EF-Abfragen verwendet werden. Sie können nicht mit der Client seitigen LINQ to Objects Abfrage verwendet werden.The async LINQ operators discussed above can only be used on EF queries - you cannot use them with client-side LINQ to Objects query. Verwenden Sie das System. Interactive. Async-Paket, um Client seitige asynchrone LINQ-Vorgänge außerhalb von EF auszuführen. Dieses Paket ist besonders nützlich für die Ausführung von Vorgängen auf dem Client, die nicht zur Auswertung auf dem Server übersetzt werden können.To perform client-side async LINQ operations outside of EF, use the System.Interactive.Async package; this package can be especially useful for performing operations on the client that cannot be translated for evaluation at the server.

Leider verursacht der Verweis auf System. Interactive. Async mehrdeutige Aufruf Kompilierungsfehler bei LINQ-Operatoren, die auf die dbsets von EF angewendet werden. Dadurch ist es schwierig, EF und System. Interactive. Async im gleichen Projekt zu verwenden.Unfortunately, referencing System.Interactive.Async causes ambiguous invocation compilation errors on LINQ operators applied to EF's DbSets; this makes it hard to use both EF and System.Interactive.Async in the same project. Um dieses Problem zu umgehen, fügen Sie Ihrem dbset asquerable hinzu:To work around this issue, add AsQueryable to your DbSet:

var groupedHighlyRatedBlogs = await context.Blogs
    .AsQueryable()
    .Where(b => b.Rating > 3) // server-evaluated
    .AsAsyncEnumerable()
    .GroupBy(b => b.Rating) // client-evaluated
    .ToListAsync();