ThreadPool
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
-
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.
-
QueueUserWorkItem çağrısı
ThreadPool.____(state => { /* iş */ });Cevabı göster
ThreadPool.QueueUserWorkItem(state => { /* iş */ }); -
ThreadPool kavramlarını eşleştir
- ThreadPool
- Hazır thread havuzu
- QueueUserWorkItem
- Kuyruğa iş ekle
- ManualResetEvent
- Sinyal ile bekle
- Task.Run
- ThreadPool + await