Yükleniyor...

Multithreading ve Paralellik

C#’ta Multithreading ve Paralellik, modern uygulamaların performansını artırmak ve kullanıcı deneyimini geliştirmek için kritik öneme sahiptir. Multithreading, aynı süreç içinde birden fazla iş parçacığının eş zamanlı olarak çalıştırılmasını sağlar. Bu sayede uzun süren işlemler kullanıcı arayüzünü engellemeden yürütülebilir. Paralellik ise birden çok işlemci çekirdeğinde görevlerin aynı anda yürütülmesini sağlayarak veri işleme ve hesaplama işlemlerini hızlandırır.
C# geliştiricileri, Thread, Task, Task Parallel Library (TPL) ve async/await gibi yapılar sayesinde multithreading ve paralelliği uygulayabilirler. lock, Mutex ve Semaphore gibi senkronizasyon mekanizmaları, paylaşılan kaynaklara güvenli erişim sağlamak için önemlidir. Bu yapılar, veri tutarlılığını sağlar ve yarış koşulları ile deadlock problemlerini önler.
Bu eğitimde, C# ile görevlerin paralel yürütülmesi, iş parçacıklarının yönetimi, hata yakalama ve performans optimizasyonu konularını öğreneceksiniz. Öğrendikleriniz, masaüstü uygulamaları, web servisleri ve yüksek performans gerektiren sistemlerde uygulanabilir. Ayrıca veri yapıları, algoritmalar ve nesne yönelimli programlama ilkeleri ile multithreading ve paralelliği birleştirerek ölçeklenebilir ve güvenilir uygulamalar geliştirebileceksiniz.

Temel Örnek

text
TEXT Code
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
static void Main()
{
Console.WriteLine("Ana iş parçacığı başlatıldı.");

Thread thread = new Thread(Calis);
thread.Start();

Task task = Task.Run(() =>
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"Görev çalışıyor: Döngü {i}");
Thread.Sleep(500);
}
});

for (int i = 0; i < 5; i++)
{
Console.WriteLine($"Ana iş parçacığı: Döngü {i}");
Thread.Sleep(300);
}

thread.Join();
task.Wait();

Console.WriteLine("Ana iş parçacığı tamamlandı.");
}

static void Calis()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"Çalışan iş parçacığı: Döngü {i}");
Thread.Sleep(400);
}
}

}

Bu örnekte, DoWork metodunu çalıştırmak için bağımsız bir iş parçacığı oluşturulur ve ana iş parçacığı ile eş zamanlı çalıştırılır. Task.Run, bir görevi asenkron olarak başlatır. Thread.Sleep, işin uzun sürdüğünü simüle eder ve iş parçacıklarının eş zamanlı çalışmasını gösterir.
thread.Join ve task.Wait ile iş parçacıkları ve görevlerin tamamlanması beklenir; bu sayede kaynaklara yanlış erişim ve yarış koşulları önlenir. Bu temel örnek, multithreading ve paralellik kavramlarını gösterir ve daha karmaşık veri işleme veya hesaplama senaryolarına temel oluşturur.

Pratik Örnek

text
TEXT Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

class Program
{
static void Main()
{
Console.WriteLine("Paralel veri işleme başlatılıyor.");

List<int> sayilar = Enumerable.Range(1, 20).ToList();

Parallel.ForEach(sayilar, sayi =>
{
int sonuc = sayi * sayi;
Console.WriteLine($"Sayı: {sayi}, Karesi: {sonuc}, Görev ID: {Task.CurrentId}");
});

var ciftSayilar = sayilar.AsParallel()
.Where(n => n % 2 == 0)
.Select(n => n * 10);

Console.WriteLine("Çift sayıların 10 ile çarpılmış sonuçları:");
foreach (var num in ciftSayilar)
{
Console.WriteLine(num);
}

Console.WriteLine("Paralel veri işleme tamamlandı.");
}

}

Bu örnekte Parallel.ForEach, bir koleksiyondaki elemanları birden çok iş parçacığı arasında dağıtarak paralel yürütür. Task.CurrentId, o anda çalışan görevin kimliğini gösterir. PLINQ (Parallel LINQ), LINQ sorgularını paralel çalıştırarak büyük veri setlerinde performansı artırır. En iyi uygulamalar arasında paylaşılan durumun minimize edilmesi, thread-safe koleksiyonların kullanımı ve iş yükünün optimize edilmesi yer alır. Bu yaklaşımlar, gerçek zamanlı sistemlerde ve yüksek performanslı uygulamalarda büyük avantaj sağlar.

C#’ta Multithreading ve Paralellik için en iyi uygulamalar, Thread yerine Task ve Parallel kullanımını teşvik eder, paylaşılan durumu minimize eder, senkronizasyon mekanizmalarını doğru uygular ve hataları try-catch veya AggregateException ile yakalar.
Yaygın hatalar arasında iş parçacıklarının tamamlanmasını beklememek, ThreadPool’u bloke etmek ve verimsiz algoritmalar kullanmak vardır. Performans optimizasyonu, yarış koşullarından kaçınma ve kaynakların korunması kritik önemdedir. Güvenlik açısından paylaşılan kaynaklara güvenli erişim ve kritik bölge koruması gerekir.

📊 Referans Tablosu

C# Element/Concept Description Usage Example
Thread Bağımsız iş parçacığı çalıştırma Thread t = new Thread(Calis); t.Start();
Task Yüksek seviyeli asenkron işlem Task.Run(() => Calis());
Parallel.ForEach Koleksiyon elemanlarını paralel çalıştırma Parallel.ForEach(sayilar, n => Islem(n));
PLINQ LINQ sorgularını paralel çalıştırma var result = sayilar.AsParallel().Where(n => n % 2 == 0);
lock Paylaşılan kaynağa özel erişim lock(obj) { /* kritik bölüm */ }
CancellationToken Görevleri güvenli şekilde iptal etme var cts = new CancellationTokenSource(); Task.Run(() => Calis(cts.Token));

Multithreading ve paralellik, C# uygulamalarının performansını ve yanıt verebilirliğini artırır. Thread, Task, Parallel ve PLINQ kullanarak güvenli ve verimli paralel uygulamalar geliştirmek önemlidir. Öğrenilen kavramlar, async/await, ileri senkronizasyon teknikleri ve paralel tasarım desenleri ile birleştirildiğinde gerçek dünya projelerinde yüksek performanslı ve ölçeklenebilir çözümler üretmek mümkündür.

🧠 Bilginizi Test Edin

Başlamaya Hazır

Test Your Knowledge

Test your understanding of this topic with practical questions.

3
Sorular
🎯
70%
Geçmek İçin
♾️
Süre
🔄
Deneme

📝 Talimatlar

  • Her soruyu dikkatle okuyun
  • Her soru için en iyi cevabı seçin
  • Quiz'i istediğiniz kadar tekrar alabilirsiniz
  • İlerlemeniz üstte gösterilecek