CodeBlanks Logo Icon CodeBlanks

ThreadPool

C# kursu · Uzman · Ders 21/47

ThreadPool ile iş parçacığı havuzunu öğrenirsin.

ThreadPool

ThreadPool, uygulamadaki kısa işleri paylaşmak için kullanılan hazır thread havuzudur. Her seferinde yeni Thread oluşturmak maliyetlidir; ThreadPool bu thread'leri yeniden kullanır.

ThreadPool.QueueUserWorkItem(callback) ile bir iş kuyruğa eklenir ve boşta olan bir havuz thread'i tarafından çalıştırılır. Uzun işler için ThreadPool uygun değildir; havuzu tüketebilir.

ThreadPool ve bekleme

ThreadPool ile kuyruğa eklenen işlerin ne zaman biteceği garanti değildir. Testlerde işin bittiğini beklemek için ManualResetEvent veya CountdownEvent gibi sinyal mekanizmaları kullanılır.

Üretim kodunda ise genellikle Task.Run tercih edilir; o da ThreadPool'u kullanır ama await ile beklemeyi kolaylaştırır ve kodu sadeleştirir.

Uygulama ThreadPool ve sinyal bekleme

ManualResetEvent done = new ManualResetEvent(false); ile sinyal oluştur. ThreadPool.QueueUserWorkItem(_ => { done.Set(); }); ile bir iş kuyruğa ekle. done.WaitOne(); ile bekle. En son Console.WriteLine("Tamam"); yaz.

Örnek çözümü göster
ManualResetEvent done = new ManualResetEvent(false); ThreadPool.QueueUserWorkItem(_ => { done.Set(); }); done.WaitOne(); Console.WriteLine("Tamam");
Örnek çözüm:
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        ManualResetEvent done = new ManualResetEvent(false);
        ThreadPool.QueueUserWorkItem(_ => { done.Set(); });
        done.WaitOne();
        Console.WriteLine("Tamam");
    }
}

Kendini test et

  1. ThreadPool.QueueUserWorkItem ne yapar?

    • Yeni thread oluşturur
    • Thread'i iptal eder
    • Thread'i bekletir
    • Bir işi havuz kuyruğuna ekler
    Cevabı göster

    Bir işi havuz kuyruğuna ekler — Doğru. QueueUserWorkItem işi havuza kuyruğa ekler.

  2. QueueUserWorkItem çağrısı

    ThreadPool.____(state => { /* iş */ });
    Cevabı göster
    ThreadPool.QueueUserWorkItem(state => { /* iş */ });
  3. ThreadPool kavramlarını eşleştir

    ThreadPool
    Hazır thread havuzu
    QueueUserWorkItem
    Kuyruğa iş ekle
    ManualResetEvent
    Sinyal ile bekle
    Task.Run
    ThreadPool + await

Uzman bölümündeki tüm dersler