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);