非同期クエリAsynchronous Queries

非同期クエリでは、クエリがデータベースで実行されている間の、スレッドのブロックを回避します。Asynchronous queries avoid blocking a thread while the query is executed in the database. これは、シック クライアント アプリケーションの UI の凍結を防止するために役立つ場合があります。This can be useful to avoid freezing the UI of a thick-client application. また、非同期操作では、データベース操作が完了している間に、他の要求を処理するためにスレッドを解放できるので、Web アプリケーションでのスループットを向上させることができます。Asynchronous operations can also increase throughput in a web application, where the thread can be freed up to service other requests while the database operation completes. 詳細については、「C# での非同期プログラミング」を参照してください。For more information, see Asynchronous Programming in C#.

警告

EF Core は、同じコンテキスト インスタンス上での複数の並列操作の実行をサポートしていません。EF Core does not support multiple parallel operations being run on the same context instance. 次の操作を開始する前に、操作が完了するまで常に待機する必要があります。You should always wait for an operation to complete before beginning the next operation. これは通常、各同期操作において await キーワードを使用することで行われます。This is typically done by using the await keyword on each asynchronous operation.

Entity Framework Core では、クエリを実行して結果を返すための LINQ メソッドの代替として使用できる、一連の非同期拡張メソッドを提供しています。Entity Framework Core provides a set of asynchronous extension methods that can be used as an alternative to the LINQ methods that cause a query to be executed and results returned. 例として、ToListAsync()ToArrayAsync()SingleAsync() などがあります。Where(...)OrderBy(...) などの LINQ 演算子の非同期バージョンはありません。これらのメソッドでは LINQ 式のツリーのみをビルドし、データベースでのクエリの実行は発生しないためです。Examples include ToListAsync(), ToArrayAsync(), SingleAsync(), etc. There are not async versions of LINQ operators such as Where(...), OrderBy(...), etc. because these methods only build up the LINQ expression tree and do not cause the query to be executed in the database.

重要

EF Core の非同期拡張メソッドは、Microsoft.EntityFrameworkCore 名前空間で定義されています。The EF Core async extension methods are defined in the Microsoft.EntityFrameworkCore namespace. メソッドを使用可能にするには、この名前空間がインポートされている必要があります。This namespace must be imported for the methods to be available.

public async Task<List<Blog>> GetBlogsAsync()
{
    using (var context = new BloggingContext())
    {
        return await context.Blogs.ToListAsync();
    }
}