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¶
-
Async Metod Tanımlama
public async Task<string> GetDataAsync() { // Asenkron işlem await Task.Delay(1000); return "Veri"; }
-
Async Void Kullanımı
public async void HandleButtonClick() { try { await ProcessDataAsync(); } catch (Exception ex) { // Hata yönetimi } }
-
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¶
-
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; });
-
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ı }
-
Task İptali
CancellationTokenSource cts = new CancellationTokenSource(); Task task = Task.Run(() => { while (!cts.Token.IsCancellationRequested) { // İşlem } }, cts.Token); // İptal cts.Cancel();
Paralel İşlemler¶
-
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);
-
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);
-
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¶
- 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¶
-
Try-Catch Kullanımı
try { await ProcessAsync(); } catch (Exception ex) { // Hata yönetimi }
-
AggregateException
try { await Task.WhenAll(tasks); } catch (AggregateException ex) { foreach (var innerEx in ex.InnerExceptions) { // Hata yönetimi } }
Asenkron Best Practices¶
-
ConfigureAwait Kullanımı
public async Task ProcessAsync() { await Task.Delay(1000).ConfigureAwait(false); }
-
ValueTask Kullanımı
public async ValueTask<int> GetNumberAsync() { if (_cache.TryGetValue("number", out int value)) return value; return await FetchNumberAsync(); }
Mülakat Soruları¶
- Async/Await Temelleri
- Async/await nedir ve nasıl çalışır?
- Task ve ValueTask arasındaki farklar nelerdir?
-
Async void ne zaman kullanılmalıdır?
-
Task İşlemleri
- Task.Run() ne zaman kullanılmalıdır?
- Task.WhenAll() ve Task.WhenAny() arasındaki farklar nelerdir?
-
Task iptali nasıl yapılır?
-
Paralel İşlemler
- Paralel işlemler ne zaman kullanılmalıdır?
- Task.WhenAll() ve Parallel.ForEach() arasındaki farklar nelerdir?
-
Paralel işlemlerde exception handling nasıl yapılır?
-
Asenkron Stream'ler
- IAsyncEnumerable nedir ve ne işe yarar?
- Asenkron stream'ler ne zaman kullanılmalıdır?
-
Asenkron stream'lerde performans optimizasyonu nasıl yapılır?
-
Exception Handling
- Asenkron metodlarda exception handling nasıl yapılır?
- AggregateException nedir ve nasıl yönetilir?
-
Asenkron işlemlerde unhandled exception'lar nasıl yakalanır?
-
Performans
- Asenkron işlemlerde performans optimizasyonu nasıl yapılır?
- ConfigureAwait(false) ne işe yarar?
-
Asenkron işlemlerde memory kullanımı nasıl optimize edilir?
-
Deadlock
- Asenkron işlemlerde deadlock nasıl oluşur?
- Deadlock nasıl önlenir?
-
ConfigureAwait(false) deadlock'u nasıl önler?
-
Resource Yönetimi
- Asenkron işlemlerde resource leak nasıl önlenir?
- IDisposable ve asenkron işlemler nasıl kullanılır?
-
Asenkron işlemlerde connection pooling nasıl yapılır?
-
Testing
- Asenkron kodlar nasıl test edilir?
- Asenkron testlerde best practices nelerdir?
-
Asenkron testlerde mock'lar nasıl kullanılır?
-
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ı¶
-
Asenkron Dosya Okuma
public async Task<string> ReadFileAsync(string path) { // Implementasyon }
-
Asenkron HTTP İsteği
public async Task<string> GetDataFromApiAsync(string url) { // Implementasyon }
-
Asenkron Veritabanı İşlemi
public async Task<List<Customer>> GetCustomersAsync() { // Implementasyon }
-
Asenkron Stream İşlemi
public async IAsyncEnumerable<string> ReadLinesAsync(string path) { // Implementasyon }
-
Asenkron Cache İşlemi
public async ValueTask<T> GetOrAddAsync<T>(string key, Func<Task<T>> factory) { // Implementasyon }