Skip to content

Async/Await

Genel Bakış

Async/Await, C#'ta asenkron programlama için kullanılan temel yapıdır. Bu yapı, uzun süren işlemleri bloklamadan yönetmeyi ve uygulama performansını artırmayı sağlar.

Mülakat Soruları ve Cevapları

1. Async/Await nedir ve nasıl çalışır?

Cevap: Async/Await, asenkron operasyonları yönetmek için kullanılan bir C# özelliğidir. Çalışma prensibi: 1. async keyword'ü ile metod işaretlenir 2. await ile asenkron operasyon beklenir 3. State machine oluşturulur 4. Callback mekanizması kullanılır

Örnek Kod:

// Basit async metod
public async Task<string> GetDataAsync()
{
    // Simüle edilmiş uzun süren işlem
    await Task.Delay(1000);
    return "Veri alındı";
}

// Async metod kullanımı
public async Task ProcessDataAsync()
{
    try
    {
        string data = await GetDataAsync();
        Console.WriteLine(data);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Hata: {ex.Message}");
    }
}

2. Task ve ValueTask arasındaki farklar nelerdir?

Cevap: Task ve ValueTask farkları: - Memory allocation - Performance - Kullanım senaryoları - Boxing/Unboxing

Örnek Kod:

// Task kullanımı
public async Task<int> GetNumberAsync()
{
    await Task.Delay(100);
    return 42;
}

// ValueTask kullanımı
public async ValueTask<int> GetNumberValueTaskAsync()
{
    if (_cache.TryGetValue("number", out int value))
    {
        return value;
    }

    value = await GetNumberFromServiceAsync();
    _cache["number"] = value;
    return value;
}

3. Async metodlarda hata yönetimi nasıl yapılır?

Cevap: Async metodlarda hata yönetimi için: - try-catch blokları - Task.Exception - AggregateException - CancellationToken

Örnek Kod:

// Hata yönetimi örneği
public async Task ProcessWithErrorHandlingAsync()
{
    try
    {
        await ProcessDataAsync();
    }
    catch (HttpRequestException ex)
    {
        Console.WriteLine($"HTTP Hatası: {ex.Message}");
    }
    catch (TimeoutException ex)
    {
        Console.WriteLine($"Zaman Aşımı: {ex.Message}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Genel Hata: {ex.Message}");
    }
}

// CancellationToken kullanımı
public async Task ProcessWithCancellationAsync(CancellationToken cancellationToken)
{
    try
    {
        await Task.Delay(1000, cancellationToken);
        // İşlem devam eder
    }
    catch (OperationCanceledException)
    {
        Console.WriteLine("İşlem iptal edildi");
    }
}

4. Async void ne zaman kullanılmalıdır?

Cevap: Async void kullanımı: - Event handler'larda - Dikkat edilmesi gereken noktalar - Exception handling - Best practices

Örnek Kod:

// Event handler örneği
private async void Button_Click(object sender, EventArgs e)
{
    try
    {
        await ProcessDataAsync();
    }
    catch (Exception ex)
    {
        // Hata loglama
        Logger.LogError(ex);
    }
}

// Async void kullanımından kaçınma
public async Task ProcessDataAsync()
{
    // Task döndüren async metod
    await Task.Delay(1000);
}

5. Async metodlarda deadlock nasıl önlenir?

Cevap: Deadlock önleme yöntemleri: - ConfigureAwait(false) - Task.Run kullanımı - SynchronizationContext - Best practices

Örnek Kod:

// Deadlock önleme
public async Task<string> GetDataWithoutDeadlockAsync()
{
    // ConfigureAwait(false) kullanımı
    var result = await GetDataFromServiceAsync().ConfigureAwait(false);
    return result;
}

// Task.Run kullanımı
public async Task ProcessInBackgroundAsync()
{
    await Task.Run(async () =>
    {
        // Uzun süren işlem
        await Task.Delay(1000);
    });
}

// SynchronizationContext örneği
public async Task ProcessWithContextAsync()
{
    var context = SynchronizationContext.Current;
    await Task.Run(() =>
    {
        // Arka plan işlemi
    });
    context?.Post(_ =>
    {
        // UI güncelleme
    }, null);
}

Best Practices

  1. Performans
  2. ConfigureAwait(false) kullanın
  3. Gereksiz async/await kullanımından kaçının
  4. ValueTask kullanımını değerlendirin
  5. Task.Run'ı dikkatli kullanın

  6. Güvenlik

  7. Exception handling yapın
  8. CancellationToken kullanın
  9. Timeout mekanizması ekleyin
  10. Resource cleanup yapın

  11. Kod Kalitesi

  12. Async suffix kullanın
  13. Task döndüren metodları tercih edin
  14. Async void kullanımından kaçının
  15. Documentation ekleyin

Kaynaklar