Bagikan melalui


Pemrograman Asinkron

Operasi asinkron tidak memblokir utas saat kueri dijalankan di dalam basis data. Operasi asinkron penting untuk mempertahankan UI yang responsif dalam aplikasi klien yang kaya fitur, dan juga dapat meningkatkan throughput dalam aplikasi web dengan membebaskan utas untuk melayani permintaan lain.

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 async C# dan kata kunci await. 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 kata kunci await 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.

Nota

EF Core meneruskan token pembatalan ke penyedia database dasar yang digunakan (misalnya Microsoft.Data.SqlClient). Token ini mungkin diterima atau mungkin tidak - periksa dokumentasi dari penyedia basis data Anda.

Operator LINQ Asinkron

Untuk mendukung eksekusi kueri LINQ secara asinkron, EF Core menyediakan serangkaian metode ekstensi asinkron yang menjalankan kueri dan mengembalikan hasil. Padanan dari operator LINQ standar yang sinkron ini juga meliputi ToListAsync, SingleAsync, AsAsyncEnumerable, 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 namespace Microsoft.EntityFrameworkCore. Namespace ini harus diimpor agar metode dapat digunakan.

Operator LINQ asinkron di sisi klien

Dalam kasus tertentu, Anda mungkin ingin menerapkan operator LINQ sisi klien untuk hasil yang kembali dari database; ini diperlukan terutama ketika Anda perlu melakukan operasi yang tidak dapat diterjemahkan ke SQL. Untuk kasus seperti itu, gunakan AsAsyncEnumerable untuk menjalankan kueri pada database, dan terus menyusun operator LINQ sisi klien melalui IAsyncEnumerable<T>yang dihasilkan. Misalnya, berikut menjalankan fungsi .NET lokal pada hasil asinkron kueri EF LINQ:

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)
{
    // ...
}

Nota

Operator LINQ melalui IAsyncEnumerable<T> diperkenalkan di .NET 10. Saat menggunakan versi .NET yang lebih lama, referensikan paket System.Linq.Async.