Zaman Uyumsuz Programlama

Zaman uyumsuz işlemler, sorgu veritabanında yürütülürken bir iş parçacığını engellemeyi önler. Zaman uyumsuz işlemler, zengin istemci uygulamalarında duyarlı bir kullanıcı arabirimi tutmak için önemlidir ve ayrıca iş parçacığını web uygulamalarında diğer isteklere hizmet vermek üzere serbest bırakmaları durumunda web uygulamalarında aktarım hızını artırabilir.

.NET standardını izleyen EF Core, G/Ç gerçekleştiren tüm zaman uyumlu yöntemlere zaman uyumsuz karşılıklar sağlar. Bunlar eşitleme yöntemleriyle aynı etkilere sahiptir ve C# async ve await anahtar sözcüklerle kullanılabilir. Örneğin, veritabanı G/Ç işlemi gerçekleştirilirken bir iş parçacığını engelleyen DbContext.SaveChanges yerine DbContext.SaveChangesAsync kullanılabilir:

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

Daha fazla bilgi için genel C# zaman uyumsuz programlama belgelerine bakın.

Uyarı

EF Core, aynı bağlam örneğinde çalıştırılan birden çok paralel işlemi desteklemez. Bir sonraki işleme başlamadan önce her zaman bir işlemin tamamlanmasını beklemelisiniz. Bu genellikle her zaman uyumsuz işlemde await anahtar sözcüğü kullanılarak yapılır.

Uyarı

Microsoft.Data.SqlClient'ın zaman uyumsuz uygulamasında ne yazık ki bazı bilinen sorunlar vardır (örneğin, #593, #601 ve diğerleri). Beklenmeyen performans sorunlarıyla karşı karşıyaysanız, özellikle büyük metin veya ikili değerlerle ilgilenirken bunun yerine eşitleme komutu yürütmeyi kullanmayı deneyin.

Dekont

EF Core, iptal belirteçlerini kullanımda olan temel veritabanı sağlayıcısına (örneğin, Microsoft.Data.SqlClient) geçirir. Bu belirteçler kabul edilebilir veya kabul edilmeyebilir. Veritabanı sağlayıcınızın belgelerine bakın.

Zaman uyumsuz LINQ işleçleri

EF Core, LINQ sorgularının zaman uyumsuz olarak yürütülmesini desteklemek için sorguyu yürüten ve sonuçları döndüren bir dizi zaman uyumsuz uzantı yöntemi sağlar. Standart, zaman uyumlu LINQ işleçlerine karşılık gelenler arasında ToListAsync, SingleAsync, AsAsyncEnumerablevb. bulunur:

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

Veya gibi WhereOrderBybazı LINQ işleçlerinin zaman uyumsuz sürümleri olmadığını unutmayın çünkü bunlar yalnızca LINQ ifade ağacını oluşturur ve sorgunun veritabanında yürütülmesine neden olmaz. Yalnızca sorgu yürütmeye neden olan işleçlerin zaman uyumsuz karşılıkları vardır.

Önemli

EF Core zaman uyumsuz uzantı yöntemleri ad alanında Microsoft.EntityFrameworkCore tanımlanır. Yöntemlerin kullanılabilir olması için bu ad alanının içeri aktarılması gerekir.

İstemci tarafı zaman uyumsuz LINQ işleçleri

Yukarıda açıklanan zaman uyumsuz LINQ işleçleri yalnızca EF sorgularında kullanılabilir; bunları istemci tarafı LINQ to Objects sorgusuyla kullanamazsınız. EF dışında istemci tarafı zaman uyumsuz LINQ işlemleri gerçekleştirmek için paketini kullanınSystem.Linq.Async; bu paket özellikle istemcide sunucuda değerlendirme için çevrilemeyen işlemleri gerçekleştirmek için yararlı olabilir.

EF Core 6.0 ve daha düşük sürümlerde başvuruda System.Linq.Async bulunmak ne yazık ki EF'in DbSet'lerine uygulanan LINQ işleçlerinde belirsiz çağırma derleme hatalarına neden olur; bu, hem EF'nin System.Linq.Async hem de aynı projede kullanılmasını zorlaştırır. Bu sorunu geçici olarak çözmek için DbSet'inize ekleyin AsQueryable :

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