Skip to content

Asenkron Programlama

Genel Bakış

Asenkron programlama, uygulamanın uzun süren işlemleri bloklamadan çalışmasını sağlayan bir programlama tekniğidir. C#'ta async/await anahtar kelimeleri ve Task sınıfı kullanılarak asenkron işlemler yapılır.

Async/Await Temelleri

  1. Async Metod Tanımlama

    public async Task<string> GetDataAsync()
    {
        // Asenkron işlem
        await Task.Delay(1000);
        return "Veri";
    }
    

  2. Async Void Kullanımı

    public async void HandleButtonClick()
    {
        try
        {
            await ProcessDataAsync();
        }
        catch (Exception ex)
        {
            // Hata yönetimi
        }
    }
    

  3. Task Dönüş Tipleri

    // Task<T> - Değer döndüren
    public async Task<int> GetNumberAsync()
    {
        return 42;
    }
    
    // Task - Değer döndürmeyen
    public async Task ProcessAsync()
    {
        await Task.Delay(1000);
    }
    

Task İşlemleri

  1. Task Oluşturma

    // Task oluşturma
    Task task = Task.Run(() => {
        Console.WriteLine("Task çalışıyor");
    });
    
    // Task<T> oluşturma
    Task<int> taskWithResult = Task.Run(() => {
        return 42;
    });
    

  2. Task Bekleme

    // Task bekleme
    await task;
    
    // Task sonucu alma
    int result = await taskWithResult;
    
    // Timeout ile bekleme
    if (await Task.WhenAny(task, Task.Delay(5000)) == task)
    {
        // Task tamamlandı
    }
    

  3. Task İptali

    CancellationTokenSource cts = new CancellationTokenSource();
    
    Task task = Task.Run(() => {
        while (!cts.Token.IsCancellationRequested)
        {
            // İşlem
        }
    }, cts.Token);
    
    // İptal
    cts.Cancel();
    

Paralel İşlemler

  1. Task.WhenAll

    Task[] tasks = new Task[3];
    tasks[0] = Task.Delay(1000);
    tasks[1] = Task.Delay(2000);
    tasks[2] = Task.Delay(3000);
    
    await Task.WhenAll(tasks);
    

  2. Task.WhenAny

    Task[] tasks = new Task[3];
    tasks[0] = Task.Delay(1000);
    tasks[1] = Task.Delay(2000);
    tasks[2] = Task.Delay(3000);
    
    Task completedTask = await Task.WhenAny(tasks);
    

  3. Parallel.ForEach

    var items = new List<int> { 1, 2, 3, 4, 5 };
    
    await Parallel.ForEachAsync(items, async (item, token) => {
        await ProcessItemAsync(item);
    });
    

Asenkron Stream'ler

  1. IAsyncEnumerable Kullanımı
    public async IAsyncEnumerable<int> GetNumbersAsync()
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(100);
            yield return i;
        }
    }
    
    // Kullanımı
    await foreach (var number in GetNumbersAsync())
    {
        Console.WriteLine(number);
    }
    

Asenkron Exception Handling

  1. Try-Catch Kullanımı

    try
    {
        await ProcessAsync();
    }
    catch (Exception ex)
    {
        // Hata yönetimi
    }
    

  2. AggregateException

    try
    {
        await Task.WhenAll(tasks);
    }
    catch (AggregateException ex)
    {
        foreach (var innerEx in ex.InnerExceptions)
        {
            // Hata yönetimi
        }
    }
    

Asenkron Best Practices

  1. ConfigureAwait Kullanımı

    public async Task ProcessAsync()
    {
        await Task.Delay(1000).ConfigureAwait(false);
    }
    

  2. ValueTask Kullanımı

    public async ValueTask<int> GetNumberAsync()
    {
        if (_cache.TryGetValue("number", out int value))
            return value;
    
        return await FetchNumberAsync();
    }
    

Mülakat Soruları

  1. Async/Await Temelleri
  2. Async/await nedir ve nasıl çalışır?
  3. Task ve ValueTask arasındaki farklar nelerdir?
  4. Async void ne zaman kullanılmalıdır?

  5. Task İşlemleri

  6. Task.Run() ne zaman kullanılmalıdır?
  7. Task.WhenAll() ve Task.WhenAny() arasındaki farklar nelerdir?
  8. Task iptali nasıl yapılır?

  9. Paralel İşlemler

  10. Paralel işlemler ne zaman kullanılmalıdır?
  11. Task.WhenAll() ve Parallel.ForEach() arasındaki farklar nelerdir?
  12. Paralel işlemlerde exception handling nasıl yapılır?

  13. Asenkron Stream'ler

  14. IAsyncEnumerable nedir ve ne işe yarar?
  15. Asenkron stream'ler ne zaman kullanılmalıdır?
  16. Asenkron stream'lerde performans optimizasyonu nasıl yapılır?

  17. Exception Handling

  18. Asenkron metodlarda exception handling nasıl yapılır?
  19. AggregateException nedir ve nasıl yönetilir?
  20. Asenkron işlemlerde unhandled exception'lar nasıl yakalanır?

  21. Performans

  22. Asenkron işlemlerde performans optimizasyonu nasıl yapılır?
  23. ConfigureAwait(false) ne işe yarar?
  24. Asenkron işlemlerde memory kullanımı nasıl optimize edilir?

  25. Deadlock

  26. Asenkron işlemlerde deadlock nasıl oluşur?
  27. Deadlock nasıl önlenir?
  28. ConfigureAwait(false) deadlock'u nasıl önler?

  29. Resource Yönetimi

  30. Asenkron işlemlerde resource leak nasıl önlenir?
  31. IDisposable ve asenkron işlemler nasıl kullanılır?
  32. Asenkron işlemlerde connection pooling nasıl yapılır?

  33. Testing

  34. Asenkron kodlar nasıl test edilir?
  35. Asenkron testlerde best practices nelerdir?
  36. Asenkron testlerde mock'lar nasıl kullanılır?

  37. Best Practices

    • Asenkron programlamada best practices nelerdir?
    • Asenkron metod isimlendirmesi nasıl yapılmalıdır?
    • Asenkron işlemlerde logging nasıl yapılmalıdır?

Örnek Kod Soruları

  1. Asenkron Dosya Okuma

    public async Task<string> ReadFileAsync(string path)
    {
        // Implementasyon
    }
    

  2. Asenkron HTTP İsteği

    public async Task<string> GetDataFromApiAsync(string url)
    {
        // Implementasyon
    }
    

  3. Asenkron Veritabanı İşlemi

    public async Task<List<Customer>> GetCustomersAsync()
    {
        // Implementasyon
    }
    

  4. Asenkron Stream İşlemi

    public async IAsyncEnumerable<string> ReadLinesAsync(string path)
    {
        // Implementasyon
    }
    

  5. Asenkron Cache İşlemi

    public async ValueTask<T> GetOrAddAsync<T>(string key, Func<Task<T>> factory)
    {
        // Implementasyon
    }
    

Kaynaklar