Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
C# Deadlock, SynchronizationContext ve ConfigureAwait
Kendi tek thread'li SynchronizationContext'imizle .Result deadlock'unu gerçekten üretip bir bekçiyle durduruyoruz. await'in context'i nasıl yakalayıp Post ettiği, konsolda ve ASP.NET Core'da neden kilitlenmediği ama thread pool starvation riski, async all the way, kütüphane kodunda ConfigureAwait(false), tamamlanmış task'ta thread'in değişmemesi ve Task.Run ile sarmanın bedeli.
C# CancellationToken: İptal, Timeout ve Linked Token
İptal .NET'te işbirliğine dayanır: token'ı alıp sormayan method durmaz. CancellationTokenSource ile CancellationToken'ın rolleri, token'ı alt katmana iletmek, CPU işinde ThrowIfCancellationRequested, Task.Run'a token vermeyince Faulted olan task, CancelAfter ve HttpClient.Timeout, linked token ile kullanıcı iptalini timeout'tan ayırmak, WhenAny kaybedenlerini durdurmak ve API tasarımı.
C# Task.WhenAll ve Task.WhenAny ile Eşzamanlı İşler
Async kod kendiliğinden eşzamanlı değildir: bağımsız işleri sırayla await etmek süreleri toplar. Önce başlatıp sonra beklemek, Task.WhenAll ile sonuçları sırayla almak, LINQ Select ile task'ları iki kez başlatma tuzağı, hata durumunda WhenAll'ın herkesi beklemesi, WhenAny ile ilk cevap ve timeout, kaybedenlerin çalışmaya devam etmesi ve bittikçe işlemek.
C# Async'te Exception: AggregateException ve WhenAll'daki Hatalar
Async method'daki exception task'ın içine konur ve await anında orijinal tipiyle fırlar. Parametre kontrolünü çağrı anında fırlatmak, Wait/GetResult/await farkı, WhenAll'da bütün hatalara ve kısmi sonuçlara ulaşmak, iki overload'da farklı çıkan hata sırası, AggregateException.Handle ve gözlenmeyen task exception'ları.
C# async/await Nasıl Çalışır: State Machine ve Continuation
await her zaman beklemez: bitmiş bir task'ta kod aynı thread'de devam eder. async kelimesinin aslında ne yaptığı, GetAwaiter/IsCompleted/OnCompleted adımları, elle yazılmış çalışan bir state machine, reflection ile derleyicinin ürettiği tipe bakmak (Debug'da class, Release'de struct), continuation'ın hangi thread'de çalıştığı ve awaitable pattern.
C# Task ve Task<T>: Sıcak Başlayan Bir Söz
Async method çağrıldığı anda çalışmaya başlar; await bir işi başlatmaz, sonucunu bekler. Task'ın yaşam döngüsü ve Status değerleri, Task.FromResult ve TaskCompletionSource ile task üretmek, aynı task'ı iki kez await etmek, işleri önce başlatıp sonra beklemek ve Task.Factory.StartNew'un Task<Task> tuzağı.
C# Thread ve ThreadPool: APM ve EAP'den TPL'e Async'in Kısa Tarihi
Foreground ve background thread farkı, Thread class'ının sonuç ve hata taşıyamaması, 1000 thread ile thread pool'un gerçek ölçümü. Ardından .NET'in async yolculuğu: APM'in Begin/End çifti, EAP'nin Completed event'i, TPL'in Task'ı ve C# 5 ile gelen async/await.
C# Async Programlama Neden Var: Bloklamak, I/O ve Ölçek
Aynı 100 stok sorgusu async ile bir saniyede, thread'i bekleten kodla 8-9 saniyede bitiyor. I/O-bound ve CPU-bound iş farkı, bloklamanın UI'da ve sunucuda bedeli, thread pool starvation, async'in hız değil kapasite kazandırması ve sahte async tuzağı.
LINQ ve .NET 10: LeftJoin, RightJoin, Shuffle, Sequence ve Async LINQ
.NET 10'da LINQ: GroupJoin ve DefaultIfEmpty pattern'ının yerini alan LeftJoin ve RightJoin, deferred çalışan Shuffle, generic math üzerine kurulu Sequence ve InfiniteSequence, BCL'e giren System.Linq.AsyncEnumerable ve System.Linq.Async paketiyle yaşanan CS0121 çakışması; .NET 11'de gelecek FullJoin'e kısa bakış.
LINQ ve .NET 9: CountBy, AggregateBy ve Index
.NET 9'da LINQ: dictionary değil sequence döndüren CountBy, key bazında biriktiren AggregateBy ve GroupBy'a göre bellek farkının BenchmarkDotNet ölçümü, Select((x, i) => ...) yerine Index(), Queryable karşılıkları ve mutable seed tuzağı.
LINQ ve .NET 7–8: Order, Selector'süz ToDictionary ve Performans
.NET 7'nin key selector istemeyen Order ve OrderDescending operatörleri, IComparable eksikliğinin ancak runtime'da patlaması, kültüre duyarlı ve ordinal string sıralama, .NET 8'in selector'süz ToDictionary'si ve BenchmarkDotNet ile ölçülen vectorize edilmiş Max/Sum ile Order ve OrderBy(x => x) farkı.
Gerçek Veriyle LINQ: JSON Dosyasından Okunan Siparişlerle Senaryolar
System.Text.Json ile dosyadan okunan siparişler üzerinde LINQ: büyük-küçük harf tuzağı ve JsonSerializerDefaults.Web, veriyi doğrulamak (tekrar eden, müşterisi olmayan, hatalı adetli kayıtlar), aylık ciro, en çok satanlar, GroupJoin ile müşteri raporu, JSON'a geri yazmak ve DeserializeAsyncEnumerable ile stream ederek okumak.