Zaman Uyumsuz Programlama

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

.NET standardını takip EF Core, tüm zaman uyumlu yöntemlere zaman uyumsuz karşıtlıklar sağlar. Bunlar eşitleme yöntemleriyle aynı etkilere sahiptir ve C# ve anahtar async sözcüklerle await kullanılabilir. Örneğin veritabanı G/Ç gerçekleştirilirken bir iş parçacığını engelecek 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 birden çok paralel işlem çalıştırmayı desteklemez. Bir sonraki işlem başlamadan önce her zaman bir işlem tamamlandıktan sonra beklemelisiniz. Bu genellikle her zaman uyumsuz await işlemde anahtar sözcüğü kullanılarak yapılır.

Uyarı

Microsoft.Data.SqlClient'ın zaman uyumsuz uygulamasında bilinen bazı sorunlar (örn. #593, #601ve diğerleri) vardır.

Not

EF Core iptal belirteçlerini kullanımdaki temel alınan veritabanı sağlayıcısına (örneğin, Microsoft.Data.SqlClient) iletir. Bu belirteçler kabul edilir veya karşılanmaz; veritabanı sağlayıcınızın belgelerine başvurun.

Zaman uyumsuz LINQ işleçleri

LINQ sorgularının zaman uyumsuz olarak yürütülmesini desteklemek için EF Core sorguyu yürüten ve sonuçları veren bir dizi zaman uyumsuz uzantı yöntemi sağlar. Standart, zaman uyumlu LINQ işleçlerinin bu karşıtları ToListAsync, SingleAsync, AsAsyncEnumerablevb. içerir:

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

Where veya OrderBygibi bazı LINQ işleçlerinin zaman uyumsuz sürümlerinin olmadığını unutmayın çünkü bunlar yalnızca LINQ ifade ağacını oluşturur ve sorgunun veritabanında yürütülsine neden olmaz. Yalnızca sorgu yürütmeye neden olan işleçlerin zaman uyumsuz karşıtları vardır.

Önemli

Zaman EF Core genişletme yöntemleri ad alanı içinde Microsoft.EntityFrameworkCore tanımlanır. Yöntemlerin kullanılabilir olması için bu ad alanının içe aktarılmış olması gerekir.

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

Yukarıda tartışılan zaman uyumsuz LINQ işleçleri yalnızca EF sorgularında kullanılabilir; bunları istemci tarafı sorgu LINQ to Objects kullanılamaz. EF dışında istemci tarafı zaman uyumsuz LINQ işlemleri gerçekleştirmek için paketini kullanın;bu paket özellikle sunucuda değerlendirme için çevrilene istemci üzerinde işlemler gerçekleştirmek için yararlı olabilir.

6.0 ve daha düşük bir EF Core'da, ne yazık ki BAŞVURU, System.Linq.Async EF'nin DbSet'leri için uygulanan LINQ işleçleri üzerinde belirsiz çağırma derleme hatalarına neden olur; bu, hem EF hem de aynı projede kullanımını zor System.Linq.Async yapar. Bu sorunu gidermek için DbSet'inize AsQueryable ekleyin:

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