.NET 11 runtime async: await artık runtime tarafından yönetiliyor
.NET 11 ile birlikte runtime, async metotların duraklatılması ve devam ettirilmesini kendisi üstleniyor; C# derleyicisi artık bu metotlar için state machine üretmiyor. Özellik preview aşamasında ve proje bazında etkinleştiriliyor. Yazı, daha küçük IL çıktısını, daha temiz stack trace'leri ve hata ayıklamada neyin değiştiğini gösteriyor.
Kilit noktalar
- Projede <Features>$(Features);runtime-async=on</Features> ile özelliği açın; .NET 11'de bu hâlâ preview.
- Derlenen metot, bayrak olarak MethodImplOptions.Async taşır ve state machine tipi, MoveNext ve hoisted alanlar üretilmez.
- Await noktaları AsyncHelpers.Await çağrısına dönüşür; IsCompleted kontrolü hızlı yolu korur.
- Canlı stack trace'lerde her async metot bir kez görünür ve AsyncMethodBuilderCore.Start çerçeveleri kaybolur.
- Devam ettirilen bir metodun çağıranları stack'te yine yoktur; zinciri izlemek için paralel stack penceresi kullanın.
- Breakpoint ve adım adım ilerleme, state machine yerine yazdığınız metot üzerinde çalışır.
Şimdiye kadar C# derleyicisi her async metodu, runtime'ın yapısını bilmediği üretilmiş bir state machine'e dönüştürüyordu. .NET 11'deki runtime async ile duraklatma işi runtime'a devrediliyor: derleyici metoda yeni bir uygulama bayrağı ekliyor ve await yerine AsyncHelpers.Await çağrıları üretiyor. Metodun gövdesi yazıldığı gibi kalıyor, yerel değişkenler de sıradan yerel olarak duruyor. Yazarın örneğinde, ayrı bir state machine tipi ve 477 bayt MoveNext yerine tek bir 82 baytlık IL metodu ortaya çıkıyor; canlı stack trace'lerde her async metot yalnızca bir kez görünüyor.
Özellik preview aşamasında ve proje dosyasındaki Features özelliğiyle açılıyor. Devam ettirilen bir metodun çağıranları yine stack'te görünmüyor, bu yüzden await zincirini izlemek için paralel stack penceresi gibi araçlar hâlâ gerekiyor. Breakpoint ve adım adım ilerleme kendi yazdığınız koda denk geliyor. .NET 11 runtime kütüphaneleri bu yolu zaten kullanıyor.
Gerçek dünyada kullanımı
- Üretimde takılan bir async servisi profiler ile incelerken builder çerçevelerinden arınmış canlı stack trace okumak.
- Bir ASP.NET Core servisindeki sıcak async yolun preview runtime ile daha küçük IL ve farklı davranış üretip üretmediğini ayrı bir dalda ölçmek.
- Blazor veya ASP.NET Core kodunda hata ararken await ifadelerinin üzerinde adım adım ilerlemek ve yerel değişkenleri doğrudan izlemek.
Neden önemli
Async kodunuzun derlenmiş biçimi ve hata ayıklama deneyimi değişebilir; .NET 11'i deneyecekseniz performans ve stack trace davranışını kendi projenizde doğrulamak gerekir.