Canlı İlerleme Çubukları - Spectre Console Serisi
Spectre.Console kütüphanesi, sıradan C# konsol uygulamalarını görsel olarak çekici, bilgilendirici araçlara dönüştürmekle ilgilidir. En çarpıcı özelliklerinden biri, uygulamanız çalıştıkça güncellenen ilerleme çubuklarını gösterebilme yeteneğidir. Uzun süren görevlerde kullanıcıyı bilgilendirmek istediğinizde bu son derece faydalıdır.
Tim Corey, "Canlı İlerleme Çubukları – Spectre Console Serisi" videosunda C# Spectre Console ilerleme çubuğu oluşturmanın adımlarını gösteriyor.
Konsol Uygulamasını Ayarlama
Videonun başında (0:00) Tim, Spectre.Console konsol kütüphanesini tanıtır ve kaynak kodu bağlantısının videonun altında olduğunu gösterir. Bu, gününüze sığdırabileceğiniz 10 dakikalık parçalar olduğunu hatırlatır.
Tim, normal bir C# konsol uygulamasında çalışıyor — Program sınıfı ve static void Main(string[] args) içeren basit bir boş şablon dosyasını düşünün. Herhangi bir özel UI çerçevesi kullanmıyor, sadece Spectre.Console'a bir NuGet paket başvurusu yapıyor. Bu, bu özellikleri herhangi bir Windows Terminali veya konsol sunucusuna getirebileceğinizi hatırlatmak için iyi bir ipucudur.
İlerleme Bağlamını Oluşturma
0:34'de Tim kodlamaya başlar. Ana yönteminde AnsiConsole.Progress() çağırır ve ardından üzerine .Start() uygular. Bu, Spectre.Console'da bir ilerleme çubuğunun standart giriş noktasıdır.
Geçişli bir parametreye sahip bir lambda kullandığınızı gösterir, bu, ileride asinron hale getirdiğinizde async ctx olarak düşünebilirsiniz. Bu bağlamın içinde görevlerinizi tanımlarsınız. Bu, Spectre.Console'un ilerleme görevlerinizi güncellemeye başlamadan önce bir yerleştirme biçimi ayarlamaya denk gelir.
İlerleme Görevleri Ekleme
Tim üç ilerleme görevi oluşturur:
"Veri İndiriliyor"
"Uygulama Yükleniyor"
- "Veri Temizliği"
Her biri var task = context.AddTask("...") ile eklenir. Bunlar, daha sonra artırabileceğiniz görev tutamaçları döndürür. Tim, (1:22) sadece yüzeyi çizdiğini belirtir—Spectre.Console farklı stilleri, sütunları ve düzenleri destekler, örneğin, çubuğunuzun nasıl göründüğünü özelleştirmek için yeni bir ProgressBarColumn, yeni bir PercentageColumn, yeni bir SpinnerColumn veya yeni bir TaskDescriptionColumn ekleyebilir.
Görevleri Visual Studio'nun yükleyicisine benzetir: indirme, yükleme, ardından temizleme (1:42). Her bir görevin, güncellerken içsel olarak bir int yüzde veya int değer tuttuğunu hayal edebilirsiniz.
İlerleme Çubuklarını Güncelleme
1:50'de Tim bağlam bitene kadar çalışacak bir while döngüsü kurar. Gerçek bir C konsol programında, Ana yönteminiz içinde while (!context.IsFinished) veya while (context.IsFinished == false) yazabilirsiniz.
Döngü içinde, şeyleri yavaşlatmak için Thread.Sleep(500) çağırır (2:15). Sonra 2:29 ve 2:47'de maksimum bir değerle çarpılmış rastgele bir double ile task.Increment() çağırır. Bu, yapilan isi simule eder.
Bir ve iki numaralı görevleri farklı hızlarla günceller ve üç numaralı görev için bir if kontrolü ekler (3:05); bu nedenle üç numaralı görev yalnızca iki numaralı görevin yüzdesi %80'den fazla olduğunda başlar. Bu, esasen ilerleme görevleri arasındaki bağımlılıkları kontrol etmektir.
Tim foreach döngüsünde int i kullanmasa da, görevlerde gezinmeyi ve her birine .Increment(int) çağrısı yapmayı hayal edebilirsiniz. Üretimde gerçek veri kayıtlarınız olabilir; örneğin bir dosyayı indiren bir var client veya işlenen bir string dosya_adı. Tim, gösterimi basit tutmak için rastgele sayılar kullanır.
İlerleme Çubuklarını Gösterme ve Gözlemleme
Saat 3:47'de Tim konsol uygulamasını çalıştırır. İlerleme çubukları üst üste görünür. Her çubuk sonunda bir yüzde gösterir ve tamamlandığında yeşile döner (4:01). İlk görevler bittiğinde "Veri Temizliği" başlar.
4:14'te Tim, imlecin konsolun altına geri döndüğünü özellikle belirtir; bu önemli bir kullanılabilirlik detayıdır. Spectre.Console ilerleme çubuğu durumu otomatik olarak biçimlendirir ve her şeyi titremeden yerinde tutar.
Await Task ile Asenkron Hale Gelme
4:36'da Tim asenkron bir sürümü göstermek için vites değiştirir. .Start()'i .StartAsync() olarak değiştirir ve lambda'yı asenkron olarak işaretler. Artık bağlam parametresi async ctx gibi davranır.
İçeride Thread.Sleep yerine await Task.Delay(500) kullanır (4:58). Bu, beklerken kontrolü sisteme geri verir. Gerçek bir programda gerçek bir işlemi bekleyebilirsiniz; örneğin await client.DownloadAsync() veya çubuğun yanına durum metni yazdırmak için await AnsiConsole.MarkupAsync().
Asenkron versiyon görsel olarak tam olarak ayni sekilde calisir (5:16–5:23), ancak modern asenkron is akislari icin daha uygundur. Tim bunu göstermiyor, ancak beklenen gorevlerinizin etrafını try/catch (Exception ex) ile sarmalayarak hataları da yakalayabilirsiniz.

AutoClear ve Bitirme
Tim, varsayılan olarak Spectre.Console'un tamamlanan görevleri ekranda %100'de bıraktığını fark eder. Bunların otomatik olarak kaybolmasını istiyorsanız, ilerlemenizi ayarladıktan sonra .AutoClear(true) çağrısı yapın (5:42). İş bittiğinde çubuklar anında kaybolur (6:02).

Bu, yalnızca geçici bir ilerleme raporu göstermeniz ve konsol çıktısını kalabalıklaştirmak istememeniz durumlarinda kullanışlıdır. Etkileşimli istemlerle, yeni panel gösterimleriyle veya hatta Spectre.Console'dan bir var tablosuyla birleştirildiginde, dinamik bir panel tarzı konsol arayüzü oluşturabilirsiniz.
Temel Bilgilerin Ötesinde – Farklı Stiller ve Sütunlar
Kapanış dakikalarında Tim (6:11), keşfedilecek çok daha fazlası olduğunu belirtir. Biçimi, renkleri ve düzenleri değiştirebilir; farklı sütun türleri kullanabilirsiniz. Örneğin yeni bir BarChart, yeni bir Table ekleyebilir veya toplu sonuçları göstermek için ilerleme çubuklarıyla yeni bir Panel birleştirebilirsiniz.
Spectre.Console belgeleri, yeni ProgressColumn uygulamalarının nasıl birleştirileceği, her görevin maksimum değerinin nasıl ayarlanacağı veya yer tasarrufu için birden çok görevin tek bir çubuğa nasıl daraltılacağı ("alan daraltması") hakkında bilgi verir. Bunları sayıları, toplam sayıları, dosya adlarını, kullanıcı adlarını veya işlenen şifreleri göstermek için kullanabilirsiniz; hepsi konsol uygulamanızın içinde düzgünce biçimlendirilmiş şekilde.
Sonuç
Tim, videosunun sonunda sundu:
Sıfırdan oluşturulan bir Spectre Console ilerleme çubuğu
Çoklu ilerleme görevlerinin nasıl tanımlanabileceği ve güncellenebileceği
Thread.Sleep ile senkron olarak veya await Task.Delay ile asenkron olarak nasıl çalıştırılacağı
Tamamlanan çubukları temizlemek için .AutoClear(true) kullanımının nasıl olduğu
- Daha ileri stil verme ve dökümantasyon için nereye gidileceği
Bu küçük demo, profesyonel görünümlü ilerleme cubuklarını herhangi bir C# konsol programina ne kadar kolay ekleyebileceğinizi gösterir. Yalnızca Spectre.Console'un NuGet paketini ve birkaç satır kod kullanarak durumları gösterebilir, yüzdeleri görüntüleyebilir ve kullanıcılarınıza uygulamanızın ne yaptığını çok daha net bir şekilde aktarabilirsiniz.

