Async C#: Tim Corey ile Async Zip'e Derinlemesine Dalış
[[academy-video-youtube({"vid": "YgQ3ta6455A", "start_time": "0", "title": "Async Zip in .NET 10 - One Line Create or Extract And More", "creator": "Tim Corey", "length": "24m 49s"})]]
Dosya sıkıştırma ve ayıklama, masaüstü uygulaması üzerinde çalışsanız da, bir web sunucusu üzerinde olsanız da veya sadece verileri arşivlemeniz gerektiğinde, birçok C# geliştiricisi için temel görevlerdir. Yıllar boyunca, .NET geliştiricileri zip dosyaları senkron bir şekilde oluştur, güncelle ve çıkarabilirdi, UI başlığını engelleyerek veya diğer işlemler gecikerek. Tim Corey, Async Zip in .NET 10 – One Line Create or Extract And More adlı videosunda açıkladığı gibi, .NET 10 zip dosyaları için asenkron işlemleri tanıtıyor, geliştiricilerin ana uygulamayı dondurmadan giriş-çıkışa bağlı işlemleri gerçekleştiren verimli kod yazmalarını sağlıyor.
C# dilinde eşzamanlı olmayan programlama esas olarak Task ve Task nesnelerine dayanır, Task sınıfı devam eden çalışmaları modellemek ve eşzamanlı yürütmeyi sağlamak için temel bileşen olarak hizmet eder. Task asenkron programlama (TAP) modeli, tipik asenkron kodlamaya soyut bir katman sağlar, asenkron işlemleri ve istisnaları yönetmeyi daha kolay hale getirir. System.Threading.Tasks.Task sınıfı ve ilgili türler, C#'ta görev tabanlı asenkron programlama modelini uygulamak için kullanılır.
Bu makalede, Tim'in açıklamasını takip ederek, asenkron/await deseni, Task nesneleri ve uygun istisna yönetimi kullanarak C#'ta asenkron işlemleri nasıl gerçekleştireceğimizi göstereceğiz.
Asenkron Programlamaya Giriş ve .NET 10'da Async Zip
Tim, C#'ın zip dosyaları oluşturup ayıklama konusundaki uzun süreli yeteneğini vurgulayarak başlar. Bununla birlikte, .NET 10 ile geliştiriciler artık bu görevleri çağırı bağlamını engellemeden asenkron kodla işleyebilir. Asenkron yöntemler ve await anahtar kelimesini kullanarak, büyük zip dosyalarını oluşturma veya çıkartma gibi işlemler arka planda, ana UI dizini duyarlı kalacak şekilde çalıştırılabilir.
Async anahtar kelimesi, C# derleyicisine, yöntemin en az bir bekleme anahtar kelimesi içerdiğini bildiren sadece bir dekoratördür. Await anahtar kelimesi yalnızca asenkron bir yöntemin içinde kullanılabilir ve bir Task veya Task<TResult> nesnesi takip etmelidir.
Tim açıklarken, bu özellikle ağ istekleri, veritabanı sorguları veya dosya I/O gibi birden fazla görev gerçekleştiren uygulamalar için önemlidir; burada görevlerin beklenmesi, CPU tabanlı görevlerin çağıran iş parçacığını bloke etmeden devam etmesine izin verir. .Result veya .Wait() ile asenkron kodu engellemek, asenkron kodu tekrar senkronize eder, bu da kilitlenmelere yol açabilir.
Asenkron yöntemler, Task veya Task<TResult> nesneleri döndürür ve görevlerin dönmesi, uygun görev bileşimi ve eşzamanlılığı sağlar. Bekleme olmadan yöntemler senkron bir şekilde yürütülür. Asenkron yöntemlerden Task nesneleri dönerek, birden fazla devam eden işlemi koordine edebilir ve istisnaları daha etkili bir şekilde yönetebilirsiniz.
Proje Ayarlama
Tim, Visual Studio 2026'yı açarak ve ZipFilesApp adında bir konsol uygulaması oluşturarak başlar. Statik async Task Main yöntemlerinin, programın giriş noktasında asenkron görevler yerine getirebileceğini, böylece ana dizini bloklamaktan kaçındığını not eder. Mevcut kodu uyarlarken, genellikle senkron kodu Görevlere sarmalayabilir veya asenkron davranışı tanıtmak için asenkron varyantlar uygulayabilirsiniz.
Ardından, temel using direktifini ekler:
using System.IO.Compression;
Bu, CreateFromDirectoryAsync ve ExtractToDirectoryAsync gibi asenkron yöntemlere erişimi etkinleştirir. Çağıran yöntemler oluştururken, asenkron yöntemleri senkron olanlardan açıkça ayırt etmek için, 'Async' ekiyle sonlandırma gibi tutarlı adlandırma kuralları kullanmak önemlidir. Tutarsız yöntem adlandırma, bir yöntemin senkron mu yoksa asenkron mu olduğuna dair kafa karışıklığına neden olabilir.
Sonra, Tim zip işlemleri için gerekli yolları tanımlamak için üç dize değişkeni hazırlar:
Kaynak dizin - Sıkıştırılacak klasör.
Hedef zip dosyası - Zip dosyasını kaydetmek için tam yol.
- Hedef dizin - Çıkartılan dosyaların saklanacağı klasör.
Tim, Windows yollarını yazarken eşlenmiş eğik çizgileri kaçınmak için dize literallerinde @ sembolünü kullanma konusunu belirtir, bu senkron kodda yaygın bir sorundur. Bu makale boyunca, nasıl asenkron programlama uygulanacağını göstermek için kod örnekleri ve kod parçacıkları sağlanmaktadır.
Bir Asenkron Yöntem Kullanarak Zip Dosyası Oluşturma
3:47'de, Tim statik async Task yöntemi kullanarak tek satırlık bir asenkron işlemi gösterir:
await ZipFile.CreateFromDirectoryAsync(
kaynakDizin,
hedefZipDosyası,
CompressionLevel.SmallestSize,
includeBaseDirectory: false
);
Burada, Tim birkaç önemli konuyu açıklar:
Async anahtar kelimesi, bu asenkron yöntemi işaretler ve beklemeyi kullanmayı mümkün kılar.
Bekleme, bu asenkron yöntemin yürütülmesini görev tamamlanana kadar durdurur, diğer görevler veya ana kullanıcı arayüzü dizininin çalışmaya devam etmesini sağlar. Bu, dosya girdi/çıktı gibi asenkron işlemlerin engellenmeyen davranışı sağlamak için beklemenin nasıl çalıştığını ve yürütmeyi nasıl duraklattığını gösterir.
CompressionLevel.SmallestSize, verimli sıkıştırmayı sağlar.
- IncludeBaseDirectory parametresi, kök klasörün zip'e dahil edilip edilmeyeceğini kontrol eder.
Bu örnek, C#'taki asenkron iş akışının async ve await anahtar kelimeleri tarafından yönetildiğini, kodu daha sürdürülebilir hale getirdiğini ve istisna yönetimini basitleştirdiğini gösterir. Await anahtar kelimesi yalnızca bir asenkron yöntemin içinde kullanılabilir, örneğin bir public async Task metodu içinde. Bekleme karşılaşıldığında, C# derleyicisi, yürütme akışını idare etmek, yürütmeyi durdurmak, asenkron görevi başlatmak ve tamamlandığında tekrar başlatmak için bir durum makinesi üretir. Asenkron yöntem bir değer döndürürse, sonuç daha sonra kullanılmak üzere bir değişkene, örneğin int sonuç gibi, yakalanabilir. Asenkron/await kullanarak, geliştiriciler, derleyicinin gerekli durum makinesini ve destekleyici kodu otomatik olarak oluşturması sayesinde elle arka plan dizinleri veya dizin havuzu görevleri oluşturmaya gerek kalmadan çalışabilirler.
Await Task ile Asenkron Olarak Bir Zip Dosyası Çıkartma
Tim, bir başka asenkron yöntemi kullanarak asenkron işlemlerle bir zip dosyası çıkartmaya geçer:
await ZipFile.ExtractToDirectoryAsync(
hedefZipDosyası,
hedefDizin,
overwriteFiles: false
);
Klasör zaten var olduğu durumda, overwriteFiles parametresinin istisna yönetimini ele aldığını belirtir. Varsayılan olarak, eğer dosyalar zaten mevcutsa ayıklama başarısız olur, fakat onu true olarak ayarlamak asenkron işlemin mevcut dosyaları değiştirmesini sağlar.
Asenkron kodla çalışırken, sağlam hata yönetimi hayati önem taşır. Tim, asenkron yöntemlerde istisnaları ele almak için try-catch blokları kullanılmasının önemini vurgular. Asenkron kodda istisna yönetimini düzgün yapmamak, asenkron görevlerde fırlatılan istisnaların hemen görülmeyebileceği için sessiz arızalara veya beklenmedik çökmelere yol açabilir. Her zaman istisnaları ele alarak güvenilir uygulama davranışı sağlayın.
Tim, bu asenkron kodun birden fazla görev için güvenli olduğunu, aynı anda meydana gelen diğer istekleri veya ağ çağrılarını engellemeyeceğini belirtir. Await anahtar kelimesini kullanarak, çağıran dizin, görev tamamlanana kadar serbest bırakılır, duyarlı bir program akışı oluşturur.
Ek olarak, asenkron yöntemleri tanımlarken, yalnızca olay işleyiciler için async void kullanmak önemlidir, örneğin GUI uygulamalarındaki buton tıklamaları. Bu durumlarda, yöntem imzası genellikle (object sender, EventArgs e) içerir, burada object sender olayın kaynağını tanımlar. Olay işleyiciler dışında async void kullanmak, öngörülemeyen davranışlara ve tanımlanması zor hatalara yol açabilir, bu yüzden çoğu asenkron yöntem için async Task tercih edin.
Dosyaları Bir Zip'e Seçmeli Olarak Ekleme
Bazen, geliştiricilerin bir bütün klasörü zip'lemekten daha fazla kontrolde bulunması gerekir. Tim, bir FileStream oluşturarak adım kontrolleriyle asenkron işlemleri nasıl gerçekleştireceğini gösterir:
await using FileStream zipStream = new FileStream(
hedefZipDosyası,
FileMode.Create,
FileAccess.Write,
FileShare.None,
bufferSize: 4096,
useAsync: true
);
Dosyaları asenkron olarak eklerken, her dosya ekleme belirli bir görevi temsil eder. Dosya eklemeler için tüm görevleri eşzamanlı başlatarak ve Task.WhenAll gibi yöntemler kullanarak tamamlanmalarını bekleyerek performansı önemli ölçüde artırabilirsiniz. Bu şekilde çalışan görevleri yönetmek, bir sunucunun aynı anda birden fazla isteği işlemesi gereken yüksek eşzamanlı senaryolar için esastır. Bu yaklaşım, uzak bir sunucuyla etkileşimde bulunurken de yaygın olarak kullanılır, uygulamaların veri beklerken bile duyarlı kalmasını sağlar.
Tim her detayı açıklar:
FileMode.Create – Yeni bir zip dosyasının oluşturulmasını veya üzerine yazılmasını sağlar.
FileAccess.Write – Dosyaya yazmayı sağlar.
FileShare.None – Dosya yazılırken diğer görevlerin dosyaya erişmesini engeller.
- useAsync: true – Asenkron dosya yazımını, çekirdek bir asenkron işlemi etkinleştirir.
Asenkron programlamanın bu bağlamda ana dizin tamamlanırken engellenmeyi önlediğini, bu durumun özellikle birden çok görevi işleyen web sunucularında kullanışlı olduğunu belirtir. Yüksek eşzamanlılık sağlayan sunucular, her bağlantı için yeni bir dizin başlatmadan birden çok aynı anda müşteri isteğini etkili bir şekilde işlemek için asenkron programlamayı kullanırlar. Ancak, asenkron kodu sıralı olarak yazmak, okumayı ve hatalarını ayıklamayı zorlaştırabilir, çünkü asenkron görevler karışık sırayla tamamlanabilir.
Zip Arşivini Oluşturma ve Dosyaları Ekleme
Sonrasında, Tim asenkron olarak bir ZipArchive oluşturur:
using ZipArchive archive = await ZipArchive.CreateAsync(
zipAkışı,
ZipArchiveMode.Create,
leaveOpen: false,
entryNameEncoding: null
);
await ifadesi, dosyaların eklenmesiyle devam etmenin güvenli olması için görev tamamlanana kadar yürütmenin durduğundan emin olur. Async ve await, geleneksel geri çağırma tabanlı yaklaşımlara kıyasla kodu daha okunabilir ve bakımı kolay hale getirerek eşzamanlı olmayan işlemlerin yönetimini basitleştirir.
Aynı kodun, eşzamanlılık bağlamına bağlı olarak farklı davranabileceğini belirtmek önemlidir. Örneğin, WPF veya WinForms uygulamalarında, bir eşzamanlılık bağlamının varlığı, bir await çağrısından sonraki devamın ana UI iş parçacığında çalışmasına neden olabilirken, konsol uygulamalarında böyle bir bağlam yoktur. Bu, async kodunuzun nasıl çalıştırıldığını etkileyebilir.
Kütüphane kodu yazarken, url olmadan await çağrısından sonra ConfigureAwait(false) kullanmayı düşünün, gereksiz bağlam değiştirmeden kaçınıp performansı artırın.
- Path.GetRelativePath kullanarak, Tim, aşamalı iş akışlarını aynı zip içinde korumanın nasıl önemli olduğunu açıklar:
foreach (string dosyaYolu in Directory.GetFiles(kaynakDizin, "*", SearchOption.AllDirectories))
{
string göreliYol = Path.GetRelativePath(kaynakDizin, dosyaYolu);
await archive.CreateEntryFromFileAsync(dosyaYolu, göreliYol).ConfigureAwait(false);
}
Bu, kaçınılmaz I/O sırasında korrekt sırayı korumak için await anahtar kelimesini kullanarak her dosya eklemenin bir eşzamanlı çağrı olduğu pratikte async kodunu gösterir. Eşzamanlı kod, mevcut iş parçacığının bloke olmamasına olanak tanır, böylece yanıt verme yeteneğini artırır ve iş parçacığının I/O işlemlerinin tamamlanmasını beklerken başka işler yapmasına izin verir.
Dosya Erişimi ve İstisnai Durum Yönetimi
Tim, yaygın bir istisnai durum yönetimi senaryosunu vurgular: orijinal FileStream görevi tamamlanmadan bir zip çıkarmaya çalışmak. Dosya kapsamlı async void metotlarını veya uygun kapsamlı using ifadeleri olmadan async Task metotlarını kullanmak şu durumlara neden olabilir:
Başka bir işlem tarafından kullanıldığından dosyaya erişim sağlanamaz.Çözüm, aynı çıkarma işlemi öncesi kaynakları serbest bırakmak için asenkron işlemi geleneksel bir kapsamlı using bloğuna sarmaktır:
await using (FileStream zipStream = new FileStream(...))
{
using ZipArchive archive = await ZipArchive.CreateAsync(zipStream, ...);
// Dosyaları asenkron olarak ekleyin
}
// Şimdi çıkarmak güvenliBu, görev nesnesinin tamamlanmasını sağlar ve eşzamanlılık bağlamını serbest bırakır, bu da dosya kilitleme hatalarını önler.
Sonuç: .NET 10'da Verimli Asenkron Zip İşlemleri
Tim, .NET 10'da asenkron zip işlemlerinin geliştiricilerin asenkron işlemleri verimli bir şekilde gerçekleştirmelerine, ana iş parçacığını engellemekten kaçınmalarına ve ağ çağrıları veya veri tabanı sorguları gibi diğer görevlerle sorunsuz bir şekilde entegre olmalarına olanak tanıdığını belirtilir.
Statik async Task metotlarını, async değiştirici ve await ifadelerini kullanarak geliştiriciler:
UI iş parçacığını dondurmadan zip dosyalarını sıkıştırır veya çıkarır.
Manuel iş parçacığı havuzu yönetimi olmadan birden fazla iş parçacığını güvenli bir şekilde yönetir.
Klasör yapısını koruyarak seçmeli zip işlemi yaparlar.
- Doğru istisnai durum yönetimi ve kaynak temizliği sağlar.
Tim'in örnekleri gösteriyor ki, dosya işlemlerinde async/await kullanımı sadece uygun değil, ayrıca C#'ta modern asenkron programlamanın hayati bir parçasıdır.
Onun videosunu takip ederek, geliştiriciler, async metotlar, await çağrıları ve asenkron iş akışlarını kullanarak basit ve karmaşık dosya sıkıştırma görevlerini sorunsuz bir şekilde ele alan verimli kod yazabilirler.

