C# dilinde asenkron ve paralel programlama, modern uygulamaların performansını artırırken kullanıcı deneyimini de iyileştirmek için kullanılan kritik tekniklerdir. Özellikle I/O işlemlerinin yoğun olduğu veya çoklu işlemci mimarisinden faydalanmak istenen uygulamalarda bu yaklaşımlar büyük önem taşır. Bu makalede, C# dilinde asenkron programlama ile paralel programlama arasındaki farklar, kullanımı ve avantajları detaylı olarak ele alınacaktır.
Asenkron Programlama Nedir?
Asenkron programlama, bir işlemin tamamlanmasını beklemeden diğer işlemlerin devam edebilmesini sağlayan bir programlama modelidir. C# dilinde bu model genellikle async ve await anahtar kelimeleri ile uygulanır. Özellikle ağ istekleri, dosya okuma/yazma gibi I/O işlemleri sırasında uygulamanın donmasını engellemek için kullanılır.
Asenkron programlama, tek bir iş parçacığı (thread) üzerinde bile çalışabilir. Temel amacı, mevcut thread’i bloke etmeden uzun süren işlemleri başlatıp başka işlerin yapılmasına olanak tanımaktır. Uzun süren işlem tamamlandığında, bekleyen kod bloğu tekrar çalıştırılır.
Basit Bir Asenkron Metot Örneği
public async Task<string> GetDataFromWebAsync()
{
using (HttpClient client = new HttpClient())
{
string result = await client.GetStringAsync("https://api.example.com/data");
return result;
}
}
Bu örnekte, GetStringAsync metodu çağrılırken thread bloke edilmez. Bunun yerine, işlem tamamlandığında devam edilir. Böylece kullanıcı arayüzü veya başka işlemler aksamadan devam edebilir.
Paralel Programlama Nedir?
Paralel programlama, aynı anda birden fazla işlemi gerçekleştirmek amacıyla birden fazla iş parçacığını (thread) kullanma yöntemidir. C# dilinde paralel programlama genellikle System.Threading.Tasks.Parallel sınıfı veya Task sınıfı ile yapılır. Bu yöntem, CPU yoğun işlemleri hızlandırmak için idealdir.
Paralel programlama, özellikle çok çekirdekli işlemcilerde verimli çalışır. Aynı görevin parçaları farklı çekirdeklere dağıtılarak işlem süresi kısaltılabilir. Ancak, paralel programlamada dikkat edilmesi gereken senkronizasyon ve yarış koşulları (race condition) gibi konular vardır.
Paralel.For Örneği
Parallel.For(0, 1000, i =>
{
// Her bir i değeri için farklı bir thread çalıştırılır
ProcessData(i);
});
Bu örnekte, 0 ile 1000 arasındaki sayılar için ProcessData metodu paralel olarak çalıştırılır. CPU’nun birden fazla çekirdeği varsa bu işlem çok daha hızlı tamamlanır.
Asenkron ve Paralel Programlama Arasındaki Farklar
Asenkron programlama ile paralel programlama karıştırılmamalıdır. Asenkron programlama, işlemciyi daha verimli kullanmak ve kullanıcı deneyimini artırmak içindir. Paralel programlama ise birden fazla işlemi aynı anda yaparak performans artışı sağlamayı amaçlar. Asenkron işlemler genellikle I/O işlemlerini içerirken, paralel işlemler CPU yoğunlukludur.
- Asenkron programlama: Blokajı önler, genellikle tek thread’te çalışır, I/O işlemleri için uygundur.
- Paralel programlama: Gerçek zamanlı çoklu işlem yapar, birden fazla thread kullanır, CPU yoğun işlemler için uygundur.
CancellationToken ile Asenkron İşlemleri Yönetmek
Asenkron işlemleri iptal edebilmek için C#’ta CancellationToken kullanılır. Bu token, uzun süren işlemleri kullanıcı isteğiyle veya belirli bir koşulda durdurmak için kritik öneme sahiptir.
public async Task LongRunningTask(CancellationToken token)
{
for (int i = 0; i < 1000; i++)
{
token.ThrowIfCancellationRequested();
await Task.Delay(1000, token);
Console.WriteLine($"İşlem {i} tamamlandı.");
}
}
Bu örnekte, ThrowIfCancellationRequested() metodu ile işlem iptal edilmişse bir istisna fırlatılır ve işlem durdurulur.
Task Sınıfı ile Paralel İşlemler
Task sınıfı, hem asenkron hem paralel işlemleri yönetmek için kullanılır. C#'ta Task.Run veya Task.Factory.StartNew ile yeni bir thread başlatılabilir ve paralel işlem yapılabilir.
Task task1 = Task.Run(() => ProcessData(1));
Task task2 = Task.Run(() => ProcessData(2));
await Task.WhenAll(task1, task2);
Bu örnekte iki farklı ProcessData işlemi ayrı thread’lerde başlatılmış ve tamamlanmaları beklenmiştir. Task.WhenAll kullanarak tüm task’lerin bitmesi beklenebilir.
Paralel LINQ (PLINQ)
PLINQ, LINQ sorgularının paralel olarak çalıştırılmasını sağlar. AsParallel() metodu ile veri koleksiyonu paralel işlenebilir.
var result = data.AsParallel()
.Where(x => x > 100)
.Select(x => x * x)
.ToList();
Bu örnekte, data koleksiyonu üzerindeki filtreleme ve seçim işlemleri paralel olarak yapılır. Özellikle büyük veri kümeleri üzerinde bu yöntem performans kazancı sağlar.
Senkronizasyon ve Paylaşılan Kaynaklar
Paralel programlamada birden fazla thread aynı veriye erişmeye çalıştığında senkronizasyon gerekir. C#’ta bu senkronizasyonu sağlamak için lock, Monitor, Semaphore, ReaderWriterLock gibi yapılar kullanılabilir.
private static readonly object lockObject = new object();
lock (lockObject)
{
// Paylaşılan kaynağa erişim
sharedResource++;
}
Bu örnekte, sharedResource değişkenine erişim lock bloğu ile senkronize edilmiştir. Böylece aynı anda yalnızca bir thread bu kaynağa erişebilir.
Async/Await ile Performans ve Kullanılabilirlik
async/await, özellikle UI tabanlı uygulamalarda kullanıcı arayüzünün donmasını engeller. Uzun süren bir işlem sırasında UI thread’in bloke edilmemesi sağlanır. Aşağıdaki örnek bir Windows Forms uygulamasında kullanımını göstermektedir:
private async void button1_Click(object sender, EventArgs e)
{
string data = await GetDataFromWebAsync();
label1.Text = data;
}
Bu örnek, butona tıklanıldığında veriyi arka planda asenkron olarak alırken, arayüzün donmasını engeller.
Sonuç
C# dilinde asenkron ve paralel programlama teknikleri, uygulamaların daha verimli ve kullanıcı dostu çalışmasını sağlar. Asenkron programlama I/O işlemlerinde thread blokajını önlerken, paralel programlama CPU yoğun görevlerde performans kazandırır. Doğru kullanıldığında bu teknikler, modern yazılım geliştirme süreçlerinde vazgeçilmez hale gelir. Geliştiricilerin ihtiyaçlarına göre doğru yaklaşımı seçmeleri ve uygulamalarında etkili bir şekilde kullanmaları gerekir.
Bir önceki yazımız olan Print Screen Engelleme başlıklı makalemizde Engelleme, İşletim Sistemi ve key logger hakkında bilgiler verilmektedir.