Ana içeriğe geç

Async LINQ

Async LINQ işlemleri, özellikle veritabanı sorgularında IO bağlamlı işlemleri optimize etmek için kullanılır. Doğru bir şekilde uygulandığında performansı artırabilir ve kullanıcı deneyimini iyileştirebilir. Ancak, yanlış kullanım performans kaybına ve kaynakların yanlış yönetilmesine yol açabilir.


1. Senkron LINQ ile Bekleme Sürelerini Artırmak

Yanlış Kullanım: Senkron LINQ metotları kullanarak IO bağlamlı işlemleri engellemek.

var users = context.Users
    .Where(u => u.IsActive)
    .ToList(); // Senkron çağrı, bloklama yaratır.

İdeal Kullanım: Asenkron LINQ metotları kullanarak bloklamayı önleyin.

var users = await context.Users
    .Where(u => u.IsActive)
    .ToListAsync();

2. ToListAsync Kullanımını Gereksiz Yere Zincirlemek

Yanlış Kullanım: ToListAsync çağrısını gereksiz yere başka işlemlerle zincirlemek.

var users = (await context.Users.ToListAsync())
    .Where(u => u.IsActive);

İdeal Kullanım: Filtreleri doğrudan asenkron sorguya dahil edin.

var users = await context.Users
    .Where(u => u.IsActive)
    .ToListAsync();

3. Her Satırda Await Kullanarak Performansı Azaltmak

Yanlış Kullanım: Her işlemde ayrı ayrı await kullanmak.

var userList = new List<User>();
foreach (var userId in userIds)
{
    var user = await context.Users.FindAsync(userId);
    userList.Add(user);
}

İdeal Kullanım: Paralel işlemleri bir arada çalıştırmak için Task.WhenAll kullanın.

var tasks = userIds.Select(id => context.Users.FindAsync(id).AsTask());
var userList = await Task.WhenAll(tasks);

4. Asenkron Olmayan Veriler İçin ToListAsync Kullanımı

Yanlış Kullanım: Bellekte olan verilerde asenkron çağrı kullanmak.

var inMemoryList = new List<int> { 1, 2, 3 };
var result = await inMemoryList.ToListAsync(); // Geçersiz kullanım

İdeal Kullanım: Asenkron olmayan veriler için standart LINQ yöntemlerini kullanın.

var inMemoryList = new List<int> { 1, 2, 3 };
var result = inMemoryList.ToList();

5. FirstAsync ve SingleAsync Kullanımını Yanlış Yönetmek

Yanlış Kullanım: Çok fazla sonuç döndüren bir sorgu için SingleAsync kullanmak.

var user = await context.Users.SingleAsync(u => u.IsActive); // Birden fazla sonuç dönerse hata

İdeal Kullanım: Sonuçların birden fazla olabileceği durumlarda FirstOrDefaultAsync kullanın.

var user = await context.Users.FirstOrDefaultAsync(u => u.IsActive);
if (user == null)
{
    Console.WriteLine("Kullanıcı bulunamadı.");
}

6. AsNoTracking Kullanımını Göz Ardı Etmek

Yanlış Kullanım: Sorgu sonuçlarını yalnızca okuma amaçlı kullanırken izleme (tracking) yapmayı ihmal etmek.

var products = await context.Products.ToListAsync(); // Tracking açık

İdeal Kullanım: Yalnızca okuma amaçlı sorgularda AsNoTracking kullanın.

var products = await context.Products.AsNoTracking().ToListAsync();