Ana içeriğe geç

Async/Await ile Asenkron Sorgular

Dapper, asenkron sorgular için async/await desteği sunar. Asenkron programlama, yüksek performanslı ve ölçeklenebilir uygulamalar oluşturmanın temel taşlarından biridir. Ancak, asenkron işlemlerin yanlış kullanımı beklenmeyen davranışlara ve performans sorunlarına yol açabilir.


1. Temel Asenkron Sorgular

❌ Yanlış Kullanım: Asenkron sorguları senkron olarak çağırmak.

var query = "SELECT * FROM Users";
var users = connection.QueryAsync<User>(query).Result; // Deadlock riski

✅ İdeal Kullanım: Asenkron çağrıları her zaman await ile bekleyin.

var query = "SELECT * FROM Users";
var users = await connection.QueryAsync<User>(query);

2. Birden Fazla Asenkron Sorgu Yönetimi

❌ Yanlış Kullanım: Sorguları sırayla çalıştırmak.

var orders = await connection.QueryAsync<Order>("SELECT * FROM Orders");
var customers = await connection.QueryAsync<Customer>("SELECT * FROM Customers");

✅ İdeal Kullanım: Sorguları aynı anda başlatın ve Task.WhenAll ile bekleyin.

var ordersTask = connection.QueryAsync<Order>("SELECT * FROM Orders");
var customersTask = connection.QueryAsync<Customer>("SELECT * FROM Customers");

await Task.WhenAll(ordersTask, customersTask);

var orders = ordersTask.Result;
var customers = customersTask.Result;

3. Transaction ile Asenkron İşlemler

Asenkron işlemleri transaction ile birleştirmek mümkündür.

✅ Örnek:

using var transaction = connection.BeginTransaction();

try
{
    var insertQuery = "INSERT INTO Orders (CustomerId) VALUES (@CustomerId)";
    await connection.ExecuteAsync(insertQuery, new { CustomerId = 1 }, transaction);

    var updateQuery = "UPDATE Customers SET IsActive = @IsActive WHERE Id = @Id";
    await connection.ExecuteAsync(updateQuery, new { IsActive = true, Id = 1 }, transaction);

    transaction.Commit();
}
catch
{
    transaction.Rollback();
    throw;
}

4. Performans ve Kaynak Yönetimi

  • Connection Pooling: Asenkron işlemlerde bağlantı havuzunun verimli kullanıldığından emin olun.
  • Cancellation Token Kullanımı: Uzun süren işlemler için iptal mekanizmaları kullanın.

✅ Örnek:

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));

var query = "SELECT * FROM Orders WHERE OrderDate > @Date";
var orders = await connection.QueryAsync<Order>(query, new { Date = DateTime.UtcNow.AddDays(-30) }, cancellationToken: cts.Token);

5. Deadlock Sorunlarını Önlemek

❌ Yanlış Kullanım: .Result veya .Wait() kullanmak.

var query = "SELECT * FROM Products";
var products = connection.QueryAsync<Product>(query).Result; // Deadlock riski

✅ İdeal Kullanım: await anahtar kelimesini kullanın.

var query = "SELECT * FROM Products";
var products = await connection.QueryAsync<Product>(query);