Skip to content

Task Parallel Library (TPL)

Giriş

Task Parallel Library (TPL), .NET uygulamalarında paralel programlama ve eşzamanlılık için güçlü bir framework'tür. Paralel işlemleri kolaylaştırmak, performansı artırmak ve kod karmaşıklığını azaltmak için tasarlanmıştır.

TPL'in Önemi

  1. Performans
  2. Çok çekirdekli işlemcilerden yararlanma
  3. Paralel işlem optimizasyonu
  4. Kaynak kullanımı optimizasyonu
  5. Ölçeklenebilirlik

  6. Kod Kalitesi

  7. Daha temiz kod yapısı
  8. Daha az boilerplate kod
  9. Daha iyi hata yönetimi
  10. Daha kolay bakım

  11. Üretkenlik

  12. Kolay kullanım
  13. Zengin API
  14. Entegre hata yönetimi
  15. İleri seviye özellikler

TPL Özellikleri

  1. Task Sınıfı
  2. Asenkron işlemler
  3. İptal desteği
  4. Hata yönetimi
  5. Continuation desteği

  6. Parallel Sınıfı

  7. Parallel.For
  8. Parallel.ForEach
  9. Parallel.Invoke
  10. Paralel LINQ (PLINQ)

  11. Dataflow Kütüphanesi

  12. Pipeline işlemleri
  13. Mesaj geçişi
  14. Veri dönüşümü
  15. Akış kontrolü

TPL Kullanımı

  1. Task Oluşturma

    public class DataProcessor
    {
        public async Task ProcessDataAsync()
        {
            // Basit task oluşturma
            var task = Task.Run(() => HeavyComputation());
    
            // Task ile çalışma
            await task;
    
            // Task sonucu alma
            var result = await Task.Run(() => ComputeResult());
        }
    
        private void HeavyComputation()
        {
            // Ağır hesaplama işlemi
            Thread.Sleep(1000);
        }
    
        private int ComputeResult()
        {
            // Sonuç hesaplama
            return 42;
        }
    }
    

  2. Task Continuation

    public class DataProcessor
    {
        public async Task ProcessWithContinuationAsync()
        {
            var task = Task.Run(() => GetData())
                .ContinueWith(t => ProcessData(t.Result))
                .ContinueWith(t => SaveData(t.Result));
    
            await task;
        }
    
        private string GetData()
        {
            // Veri alma
            return "data";
        }
    
        private string ProcessData(string data)
        {
            // Veri işleme
            return data.ToUpper();
        }
    
        private void SaveData(string data)
        {
            // Veri kaydetme
        }
    }
    

  3. Parallel.For Kullanımı

    public class ParallelProcessor
    {
        public void ProcessInParallel()
        {
            var data = new int[1000];
    
            Parallel.For(0, data.Length, i =>
            {
                data[i] = ComputeValue(i);
            });
        }
    
        private int ComputeValue(int index)
        {
            // Değer hesaplama
            return index * 2;
        }
    }
    

  4. Parallel.ForEach Kullanımı

    public class ParallelProcessor
    {
        public void ProcessCollectionInParallel()
        {
            var items = Enumerable.Range(0, 1000).ToList();
            var results = new ConcurrentBag<int>();
    
            Parallel.ForEach(items, item =>
            {
                var result = ProcessItem(item);
                results.Add(result);
            });
        }
    
        private int ProcessItem(int item)
        {
            // Öğe işleme
            return item * 2;
        }
    }
    

  5. Dataflow Kullanımı

    public class DataflowProcessor
    {
        public async Task ProcessWithDataflowAsync()
        {
            var transformBlock = new TransformBlock<int, string>(n =>
            {
                return n.ToString();
            });
    
            var actionBlock = new ActionBlock<string>(s =>
            {
                Console.WriteLine(s);
            });
    
            transformBlock.LinkTo(actionBlock, new DataflowLinkOptions { PropagateCompletion = true });
    
            for (int i = 0; i < 10; i++)
            {
                transformBlock.Post(i);
            }
    
            transformBlock.Complete();
            await actionBlock.Completion;
        }
    }
    

TPL Best Practices

  1. Task Tasarımı
  2. Küçük ve odaklı tasklar
  3. İptal desteği
  4. Hata yönetimi
  5. Kaynak temizleme

  6. Performans

  7. Task boyutu optimizasyonu
  8. Paralellik derecesi ayarı
  9. Kaynak kullanımı
  10. Ölçeklenebilirlik

  11. Güvenlik

  12. Thread-safe kod
  13. Veri senkronizasyonu
  14. Kaynak yönetimi
  15. Hata izolasyonu

  16. Monitoring

  17. Task durumu takibi
  18. Performans metrikleri
  19. Hata izleme
  20. Kaynak kullanımı

Mülakat Soruları

Temel Sorular

  1. TPL nedir ve neden kullanılır?
  2. Cevap: Task Parallel Library (TPL), .NET uygulamalarında paralel programlama ve eşzamanlılık için güçlü bir framework'tür. Paralel işlemleri kolaylaştırmak, performansı artırmak ve kod karmaşıklığını azaltmak için tasarlanmıştır.

  3. TPL'in temel özellikleri nelerdir?

  4. Cevap:

    • Task sınıfı
    • Parallel sınıfı
    • Dataflow kütüphanesi
    • Asenkron programlama desteği
    • Paralel LINQ
  5. TPL'in avantajları nelerdir?

  6. Cevap:

    • Performans artışı
    • Kod kalitesi
    • Üretkenlik
    • Ölçeklenebilirlik
    • Kolay kullanım
  7. Task ve Thread arasındaki fark nedir?

  8. Cevap: Task, daha yüksek seviyeli bir soyutlamadır ve thread havuzunu kullanır. Thread ise daha düşük seviyeli bir işletim sistemi kaynağıdır. Task'lar daha az kaynak kullanır ve daha kolay yönetilir.

  9. TPL'de task tipleri nelerdir?

  10. Cevap:
    • Task: Genel amaçlı task
    • Task: Sonuç döndüren task
    • ValueTask: Hafif task
    • TaskCompletionSource: Manuel task kontrolü

Teknik Sorular

  1. Task nasıl oluşturulur?
  2. Cevap:

    public class TaskCreator
    {
        public Task CreateTask()
        {
            return Task.Run(() =>
            {
                // İşlem
            });
        }
    
        public Task<int> CreateTaskWithResult()
        {
            return Task.Run(() =>
            {
                return 42;
            });
        }
    }
    

  3. Task continuation nasıl kullanılır?

  4. Cevap:

    public class TaskContinuation
    {
        public async Task ProcessWithContinuation()
        {
            await Task.Run(() => GetData())
                .ContinueWith(t => ProcessData(t.Result))
                .ContinueWith(t => SaveData(t.Result));
        }
    }
    

  5. Parallel.For nasıl kullanılır?

  6. Cevap:

    public class ParallelProcessor
    {
        public void ProcessInParallel()
        {
            var data = new int[1000];
    
            Parallel.For(0, data.Length, i =>
            {
                data[i] = ComputeValue(i);
            });
        }
    }
    

  7. Dataflow nasıl kullanılır?

  8. Cevap:

    public class DataflowProcessor
    {
        public async Task ProcessWithDataflow()
        {
            var transformBlock = new TransformBlock<int, string>(n => n.ToString());
            var actionBlock = new ActionBlock<string>(s => Console.WriteLine(s));
    
            transformBlock.LinkTo(actionBlock);
    
            for (int i = 0; i < 10; i++)
            {
                transformBlock.Post(i);
            }
    
            transformBlock.Complete();
            await actionBlock.Completion;
        }
    }
    

  9. TPL'de hata yönetimi nasıl yapılır?

  10. Cevap:
    public class TaskErrorHandler
    {
        public async Task HandleErrors()
        {
            try
            {
                await Task.Run(() => RiskyOperation());
            }
            catch (Exception ex)
            {
                // Hata yönetimi
            }
        }
    
        private void RiskyOperation()
        {
            // Riskli işlem
        }
    }
    

İleri Seviye Sorular

  1. TPL'de performans optimizasyonu nasıl yapılır?
  2. Cevap:

    • Task boyutu optimizasyonu
    • Paralellik derecesi ayarı
    • Kaynak kullanımı
    • Ölçeklenebilirlik
    • Thread pool yönetimi
  3. TPL'de deadlock nasıl önlenir?

  4. Cevap:

    • Async/await kullanımı
    • Task.WhenAll kullanımı
    • Timeout mekanizmaları
    • Kaynak sıralaması
    • Deadlock tespiti
  5. TPL ile distributed sistemler nasıl yönetilir?

  6. Cevap:

    • Task dağıtımı
    • Load balancing
    • Failover stratejileri
    • Consistency yönetimi
    • Monitoring
  7. TPL'de monitoring nasıl yapılır?

  8. Cevap:

    • Task durumu takibi
    • Performans metrikleri
    • Hata izleme
    • Kaynak kullanımı
    • Profiling
  9. TPL'de scaling nasıl yapılır?

  10. Cevap:
    • Task parçalama
    • Paralellik derecesi ayarı
    • Kaynak yönetimi
    • Load balancing
    • Performance tuning