Bagikan melalui


Pemrograman Asinkron

Operasi asinkron menghindari pemblokiran utas saat kueri dijalankan dalam database. Operasi asinkron penting untuk menjaga UI responsif dalam aplikasi klien yang kaya, dan juga dapat meningkatkan throughput dalam aplikasi web di mana mereka membebaskan utas untuk melayani permintaan lain dalam aplikasi web.

Mengikuti standar .NET, EF Core menyediakan mitra asinkron untuk semua metode sinkron yang melakukan I/O. Ini memiliki efek yang sama dengan metode sinkronisasi, dan dapat digunakan dengan C# async dan await kata kunci. Misalnya, alih-alih menggunakan DbContext.SaveChanges, yang akan memblokir utas saat I/O database dilakukan, DbContext.SaveChangesAsync dapat digunakan:

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

Untuk informasi selengkapnya, lihat dokumen pemrograman asinkron C# umum.

Peringatan

EF Core tidak mendukung beberapa operasi paralel yang dijalankan pada instans konteks yang sama. Anda harus selalu menunggu operasi selesai sebelum memulai operasi berikutnya. Ini biasanya dilakukan dengan menggunakan await kata kunci pada setiap operasi asinkron.

Peringatan

Implementasi asinkron Microsoft.Data.SqlClient sayangnya memiliki beberapa masalah yang diketahui (misalnya #593, #601, dan lainnya). Jika Anda melihat masalah performa yang tidak terduga, coba gunakan eksekusi perintah sinkronisasi, terutama saat berhadapan dengan teks besar atau nilai biner.

Catatan

EF Core meneruskan token pembatalan ke penyedia database dasar yang digunakan (misalnya Microsoft.Data.SqlClient). Token ini mungkin atau mungkin tidak terhormat - lihat dokumentasi penyedia database Anda.

Operator Asinkron LINQ

Untuk mendukung eksekusi kueri LINQ secara asinkron, EF Core menyediakan serangkaian metode ekstensi asinkron yang menjalankan kueri dan mengembalikan hasil. Rekan-rekan ini dengan operator LINQ standar dan sinkron termasuk ToListAsync, , SingleAsyncAsAsyncEnumerable, dll.:

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

Perhatikan bahwa tidak ada versi asinkron dari beberapa operator LINQ seperti Where atau OrderBy, karena ini hanya membangun pohon ekspresi LINQ dan tidak menyebabkan kueri dijalankan dalam database. Hanya operator yang menyebabkan eksekusi kueri memiliki rekan asinkron.

Penting

Metode ekstensi asinkron EF Core didefinisikan dalam Microsoft.EntityFrameworkCore namespace layanan. Namespace layanan ini harus diimpor agar metode tersedia.

Operator LINQ asinkron sisi klien

Operator LINQ asinkron yang dibahas di atas hanya dapat digunakan pada kueri EF - Anda tidak dapat menggunakannya dengan kueri LINQ sisi klien ke Objek. Untuk melakukan operasi LINQ asinkron sisi klien di luar EF, gunakan System.Linq.Async paket; paket ini dapat sangat berguna untuk melakukan operasi pada klien yang tidak dapat diterjemahkan untuk evaluasi di server.

Dalam EF Core 6.0 dan yang lebih rendah, merujuk System.Linq.Async sayangnya menyebabkan kesalahan kompilasi pemanggilan ambigu pada operator LINQ yang diterapkan pada DbSets EF; ini membuatnya sulit untuk menggunakan EF dan System.Linq.Async dalam proyek yang sama. Untuk mengatasi masalah ini, tambahkan AsQueryable ke DbSet Anda:

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