.NET 11 Process.RunAndCaptureText ile stdout/stderr deadlock sorunu çözülüyor
.NET 11 RC2 ile gelen Process.RunAndCaptureText, dış komut çalıştırırken sık görülen stdout ve stderr deadlock'unu tek çağrıyla önlüyor. Metin çıktısı, exit code ve süre sınırı tek sonuç nesnesinde geliyor. Git veya CLI araçlarını çağıran her .NET geliştiricisinin bilmesi gereken bir değişiklik.
Kilit noktalar
- Process.RunAndCaptureText(fileName, args) stdout ve stderr'i eşzamanlı okur ve ProcessTextOutput döndürür.
- Argümanlar string listesi olarak verilir; boşluk ve tırnak için ayrıca kaçış gerekmez.
- Zaman aşımı yerleşik gelir; aşılınca TimeoutException fırlatılır.
- ProcessStartInfo overload'u her iki akışın yönlendirilmiş ve UseShellExecute'un false olmasını ister.
- Non-zero exit code exception fırlatmaz; hata kararını kendi kodunuz vermelidir.
- API'ler .NET 11 ile gelir, .NET 10 SDK'da derlenmez.
Dış araçları çağıran uygulamalarda, yönlendirilmiş stdout ve stderr akışlarını sırayla okumak uzun süredir bilinen bir deadlock kaynağıdır. Çocuk süreç stderr borusunu doldurup beklerken uygulama stdout'un bitmesini bekler ve ikisi de ilerleyemez. .NET 11 ile System.Diagnostics altına eklenen Process.RunAndCaptureText bu sorunu iki akışı aynı anda boşaltarak çözüyor. Argümanlar string dizisi olarak verildiği için tırnaklama derdi de kalmıyor.
Dönen ProcessTextOutput nesnesi StandardOutput, StandardError, ExitStatus ve ProcessId özelliklerini taşıyor. Zaman aşımı aşılırsa çağrı TimeoutException fırlatıyor; asenkron sürüm ise CancellationToken ile iptal edilebiliyor. Bu API'ler RC2 aşamasında olduğu için üretimde kullanım desteklense de tam sürüm öncesi davranış değişebilir. Ayrıntılar ve diğer yardımcı metotlar için orijinal yazıya bakmak faydalı olur.
Gerçek dünyada kullanımı
- Build pipeline'ında git status veya dotnet komutlarını çağırıp çıktıyı ayrıştıran bir araç.
- Gürültülü uyarı üreten CLI araçlarını (ffmpeg, Node tabanlı araçlar) uygulamadan yöneten bir servis.
- Zaman aşımı ve iptal gerektiren arka plan işçisi, örneğin dış bir komutun sonucunu bekleyen bir kuyruk tüketicisi.
Neden önemli
Elle yazılmış Process kodundaki deadlock riski tek bir çağrıyla ortadan kalkıyor. Ancak .NET 11 henüz RC aşamasında olduğu için üretim kodunda kullanmadan önce sürüm notlarını kontrol etmek gerekir.