Aracılığıyla paylaş


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, rich client uygulamalarında kullanıcı arabiriminin duyarlı kalmasını sağlamak için önemlidir. Ayrıca, iş parçacığını web uygulamalarında diğer isteklere hizmet verebilmesi için serbest bıraktıklarında, aktarım hızını artırabilirler.

.NET standardını takip eden EF Core, G/Ç gerçekleştiren tüm senkron yöntemlere asenkron karşılıklar sağlar. Bunlar eşitleme yöntemleriyle aynı etkilere sahiptir ve C# async ve await anahtar sözcükleriyle 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 bkz. genel C# zaman uyumsuz programlama belgeleri.

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 bir eşzamansız işlemde await anahtar sözcüğü kullanılarak yapılır.

Uyarı

Microsoft.Data.SqlClient asenkron uygulamasında ne yazık ki bazı bilinen sorunlar vardır (örneğin #593, #601ve 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.

Not

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çlerinin bu karşılıkları 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ü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 eşdeğerleri vardır.

Önemli

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

İstemci tarafı asenkron LINQ işleçleri

Bazı durumlarda, veritabanından geri gelen sonuçlara istemci tarafı LINQ işleçleri uygulamak isteyebilirsiniz; bu, özellikle SQL'e çevrilemeyen bir işlem gerçekleştirmeniz gerektiğinde gereklidir. Bu gibi durumlarda, veritabanında sorguyu yürütmek için AsAsyncEnumerable kullanın ve sonuçta elde edilen IAsyncEnumerable<T>üzerinde istemci tarafı LINQ işleçleri oluşturma işlemine devam edin. Örneğin, aşağıdakiler EF LINQ sorgusunun zaman uyumsuz sonuçlarında yerel bir .NET işlevi yürütür:

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

Not

IAsyncEnumerable<T> üzerindeki LINQ işleçleri .NET 10'da kullanıma sunulmuştur. .NET'in eski bir sürümünü kullanırken System.Linq.Async paketine başvurun.