Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
C#'ta Event: EventHandler, Güvenli Tetikleme ve Subscription Leak
event keyword'ünün delegate'i nasıl koruduğu ve CS0070, compiler'ın ürettiği private field ile add/remove method'ları, EventHandler konvansiyonu ve record ile event verisi, ?.Invoke ile güvenli tetikleme, kendi add/remove accessor'ların ve CS0079, WeakReference ile ölçülen 50 MB'lık subscription leak'i ve IDisposable dönen Subscribe.
C#'ta Lambda ve Closure: Yakalanan Değişken Tuzağı
Lambda'nın biçimleri ve C# 10 açık dönüş tipi, closure'ın değişkenin değerini değil kendisini yakalaması, compiler'ın ürettiği display class'ı reflection ile görmek, for döngüsünde yakalanan değişken ve C# 5'in foreach değişikliği, closure başına 88 byte allocation ölçümü, static lambda ve CS8820, deferred LINQ ile birleşen yakalama hatası.
C#'ta Delegate, Func ve Action: Method'u Değer Gibi Taşımak
Delegate bir method'u tutan tiptir: MulticastDelegate'ten derive eden class, Method ve Target, Func/Action/Predicate, C# 10 ile lambda'nın doğal tipi ve CS8917, method'u parametre olarak geçirmek, multicast delegate'in son sonucu ve kesilen zincir, delegate tipleri arası dönüşüm ve variance, null delegate ve -= ile çıkmayan lambda tuzakları.
C# Async ve .NET 9–10: Task.WhenEach, Lock Tipi ve Framework'teki Async LINQ
WhenAny döngüsünün yerini alan .NET 9 Task.WhenEach ve hatalı task'larla davranışı, C# 13 lock statement'ının tanıdığı System.Threading.Lock ile CS9216, CS1996, CS4007 ve CS9202 sınırları, .NET 10'da framework'e giren async LINQ, async Select ve System.Linq.Async paketiyle çakışmanın çözümü.
C# Async ve .NET 8: TimeProvider, ConfigureAwaitOptions, Parallel.ForAsync ve CancelAsync
.NET 6'da kendi IClock'umuzu yazıyorduk; .NET 8'de TimeProvider ve FakeTimeProvider ile 15 dakikalık bekleme testte 0 ms sürüyor. Exception fırlatmadan bekleyen SuppressThrowing ve Task<T> tuzağı, ForceYielding, index aralığını doğrudan alan Parallel.ForAsync ve callback'leri iptal edeni bekletmeden çalıştıran CancelAsync.
C# Timer'lar ve Bekleme: PeriodicTimer, WaitAsync ve Task.Delay
System.Threading.Timer'da üst üste binen callback'ler, .NET 6 PeriodicTimer ile çakışmasız periyodik iş, Thread.Sleep ile Task.Delay'in thread pool'a etkisi ve Task.Delay'in hassasiyeti, exception'ları yutan System.Timers.Timer, işlemi iptal etmeyen WaitAsync, backoff ve jitter ile retry, GC'nin topladığı timer.
C# Channels ile Producer/Consumer: Backpressure, Bounded Channel ve Pipeline
System.Threading.Channels ile async queue: kapasitesi iki olan channel'a neden üç sipariş sığıyor, Writer/Reader ve Complete, WaitToReadAsync/TryRead döngüsü, bounded channel'da FullMode seçenekleri ve itemDropped, birden çok consumer, hatayı Complete(ex) ile ileten bir sipariş pipeline'ı ve Complete'i unutmanın bedeli.
C# Senkronizasyon: lock, Interlocked, SemaphoreSlim ve Concurrent Collection'lar
sold++ neden bir milyonu bulmuyor: race condition ve check-then-act. lock'un kuralları ve içinde await yazılamaması, Interlocked ile atomik sayaç ve CompareExchange, async cache için SemaphoreSlim pattern'i, ConcurrentDictionary'de factory'nin birden çok kez çalışması ve Lazy<T> çözümü.
C# Paralellik: Parallel.For, Parallel.ForEachAsync, PLINQ ve Task.Run Ne Zaman
Parallel.ForEach'e async lambda verince neden hiçbir iş bitmiyor, concurrency ile paralellik farkı, Parallel.For ve thread-local toplama, .NET 6 Parallel.ForEachAsync ile sınırlı concurrency, PLINQ'te sıra, BenchmarkDotNet ile paralelliğin ne zaman kazandırıp ne zaman kaybettirdiği ve Task.Run'ın doğru yeri.
C# IAsyncEnumerable, await foreach ve Async Dispose
Sayfalı bir API'den gelen kitapları Task<List<T>> ile toplamak ilk elementi en sona bırakır; async iterator ile yield return ve await bir aradayken ilk sayfa hemen akar. await foreach'in açılımı ve MoveNextAsync'in ValueTask'ı, EnumeratorCancellation ve CS8425, break'te çalışan finally, IAsyncDisposable ve await using, DeserializeAsyncEnumerable ve ASP.NET Core'da stream.
C# ValueTask: Ne Zaman Task Yerine, Hangi Kurallarla
Cache'ten senkron dönen bir async method Task<int> ile her çağrıda 72 byte ayırırken ValueTask<int> hiç ayırmaz. Debug ve Release ölçüm farkı, runtime'ın küçük sonuç cache'i, BenchmarkDotNet ile cache ve gerçekten asenkron yollar, ValueTask'ı iki kez await etmenin Channel üzerinde gerçek InvalidOperationException'ı, AsTask ve ne zaman ValueTask seçmeli.
C# async void ve Fire-and-Forget: Kaybolan Exception'lar
async void method'dan çıkan exception neden try/catch'e gelmeden process'i çökertir ve async Task bunu nasıl çözer. Event handler'larda async void'in doğru kullanımı, List.ForEach ile gizli async void, beklenmeyen task'ın sessizce kaybolan hatası ve UnobservedTaskException, CS4014 uyarısı, hatayı log'a düşüren güvenli Forget extension'ı ve ASP.NET Core'da scope tuzağı.