Yönetilen iş parçacığı havuzu

System.Threading.ThreadPool sınıfı, uygulamanıza sistem tarafından yönetilen bir çalışan iş parçacıkları havuzu sağlar ve iş parçacığı yönetimi yerine uygulama görevlerine odaklanmanıza olanak sağlar. Arka plan işleme gerektiren kısa görevleriniz varsa, yönetilen iş parçacığı havuzu birden çok iş parçacığından yararlanmanın kolay bir yoludur. İş parçacığı havuzu iş parçacıklarında zaman uyumsuz görevler gerçekleştiren ve nesneler oluşturabildiğiniz Task için, framework 4 ve Task<TResult> sonraki sürümlerde iş parçacığı havuzunun kullanımı önemli ölçüde daha kolaydır.

.NET, Görev Paralel Kitaplığı (TPL) işlemleri, zaman uyumsuz G/Ç tamamlama, zamanlayıcı geri çağırmaları, kayıtlı bekleme işlemleri, temsilciler kullanan zaman uyumsuz yöntem çağrıları ve System.Net yuva bağlantıları gibi birçok amaçla iş parçacığı havuzu iş parçacıklarını kullanır.

İş parçacığı havuzu özellikleri

İş parçacığı havuzu iş parçacıkları arka plan iş parçacıklarıdır. Her iş parçacığı varsayılan yığın boyutunu kullanır, varsayılan önceliğe göre çalışır ve çok iş parçacıklı dairededir. İş parçacığı havuzundaki bir iş parçacığı görevini tamamladıktan sonra bekleyen iş parçacıkları kuyruğuna döndürülür. Bu andan itibaren yeniden kullanılabilir. Bu yeniden kullanım, uygulamaların her görev için yeni iş parçacığı oluşturma maliyetini önlemesini sağlar.

İşlem başına yalnızca bir iş parçacığı havuzu vardır.

İş parçacığı havuzu iş parçacıklarındaki özel durumlar

İş parçacığı havuzu iş parçacıklarındaki işlenmeyen özel durumlar işlemi sonlandırır. Bu kuralın üç özel durumu vardır:

Daha fazla bilgi için bkz . Yönetilen İş Parçacıklarında Özel Durumlar.

İş parçacığı havuzu iş parçacığı sayısı üst sınırı

İş parçacığı havuzuna kuyruğa alınabilecek işlem sayısı yalnızca kullanılabilir bellekle sınırlıdır. Ancak, iş parçacığı havuzu aynı anda işlemde etkin olabilecek iş parçacığı sayısını sınırlar. Tüm iş parçacığı havuzu iş parçacıkları meşgulse, yürütülecek iş parçacıkları kullanılabilir duruma gelene kadar ek iş öğeleri kuyruğa alınır. bir işlem için iş parçacığı havuzunun varsayılan boyutu, sanal adres alanının boyutu gibi çeşitli faktörlere bağlıdır. bir işlem, iş parçacığı sayısını belirlemek için yöntemini çağırabilir ThreadPool.GetMaxThreads .

ve ThreadPool.SetMaxThreads yöntemlerini kullanarak ThreadPool.GetMaxThreads en fazla iş parçacığı sayısını denetleyebilirsiniz.

Not

Ortak dil çalışma zamanını barındıran kod, yöntemini kullanarak ICorThreadpool::CorSetMaxThreads boyutu ayarlayabilir.

İş parçacığı havuzu minimumları

İş parçacığı havuzu, her kategori için belirtilen en düşük değere ulaşana kadar isteğe bağlı olarak yeni çalışan iş parçacıkları veya G/Ç tamamlama iş parçacıkları sağlar. Bu en düşük değerleri almak için yöntemini kullanabilirsiniz ThreadPool.GetMinThreads .

Not

Talep düşük olduğunda, gerçek iş parçacığı havuzu iş parçacığı sayısı minimum değerlerin altına düşebilir.

En düşük değere ulaşıldığında, iş parçacığı havuzu ek iş parçacıkları oluşturabilir veya bazı görevler tamamlanana kadar bekleyebilir. İş parçacığı havuzu, aktarım hızını iyileştirmek için çalışan iş parçacıklarını oluşturur ve yok eder. Bu, zaman birimi başına tamamlanan görev sayısı olarak tanımlanır. Çok az iş parçacığı kullanılabilir kaynakları en iyi şekilde kullanmayabilirken, çok fazla iş parçacığı kaynak çekişmelerini artırabilir.

Dikkat

Boşta kalan iş parçacığı sayısını en az artırmak için yöntemini kullanabilirsiniz ThreadPool.SetMinThreads . Ancak, bu değerleri gereksiz yere artırmak performans sorunlarına neden olabilir. Aynı anda çok fazla görev başlatılırsa, bunların tümü yavaş görünebilir. Çoğu durumda iş parçacığı havuzu, iş parçacıklarını ayırmaya yönelik kendi algoritmasıyla daha iyi performans gösterir.

İş parçacığı havuzunu kullanma

İş parçacığı havuzunu kullanmanın en kolay yolu, Görev Paralel Kitaplığı'nı (TPL) kullanmaktır. Varsayılan olarak, gibi TPL türleri Task ve Task<TResult> görevleri çalıştırmak için iş parçacığı havuzu iş parçacıklarını kullanır.

İş parçacığı havuzunu, yönetilen koddan (veya ICorThreadpool::CorQueueUserWorkItem yönetilmeyen koddan) çağırarak ThreadPool.QueueUserWorkItem ve görevi gerçekleştiren yöntemi temsil eden bir System.Threading.WaitCallback temsilci geçirerek de kullanabilirsiniz.

İş parçacığı havuzunu kullanmanın başka bir yolu, yöntemini kullanarak ThreadPool.RegisterWaitForSingleObject bir bekleme işlemiyle ilgili iş öğelerini kuyruğa almak ve sinyal verildiğinde veya zaman aşımına uğradıklarında temsilci tarafından System.Threading.WaitOrTimerCallback temsil edilen yöntemi çağıran bir System.Threading.WaitHandle ileti geçirmektir. İş parçacığı havuzu iş parçacıkları geri çağırma yöntemlerini çağırmak için kullanılır.

Örnekler için başvuruda bulunan API sayfalarını gözden geçirin.

Güvenlik denetimlerini atlama

İş parçacığı havuzu ve yöntemlerini de sağlar ThreadPool.UnsafeQueueUserWorkItemThreadPool.UnsafeRegisterWaitForSingleObject . Bu yöntemleri yalnızca çağıranın yığınının kuyruğa alınan görevin yürütülmesi sırasında gerçekleştirilen güvenlik denetimleriyle ilgisiz olduğundan emin olduğunuzda kullanın. ThreadPool.QueueUserWorkItem ve ThreadPool.RegisterWaitForSingleObject her ikisi de çağıranın yığınını yakalar ve iş parçacığı bir görevi yürütmeye başladığında iş parçacığı havuzu iş parçacığı yığınıyla birleştirilir. Güvenlik denetimi gerekiyorsa yığının tamamı denetlenmelidir. Denetim güvenlik sağlasa da performans maliyeti de vardır.

İş parçacığı havuzu iş parçacıkları kullanılmadığında

İş parçacığı havuzu iş parçacıklarını kullanmak yerine kendi iş parçacıklarınızı oluşturmanın ve yönetmenin uygun olduğu çeşitli senaryolar vardır:

  • Ön plan iş parçacığına ihtiyacınız vardır.
  • İş parçacığının belirli bir önceliğe sahip olması gerekir.
  • İş parçacığının uzun süreler boyunca engellenmesine neden olan görevleriniz vardır. İş parçacığı havuzunun iş parçacığı sayısı üst sınırı vardır, bu nedenle çok sayıda engellenen iş parçacığı havuzu iş parçacığı görevlerin başlatılmasını engelleyebilir.
  • İş parçacıklarını tek iş parçacıklı bir daireye yerleştirmeniz gerekir. Tüm ThreadPool iş parçacıkları çok iş parçacıklı dairededir.
  • İş parçacığıyla ilişkili kararlı bir kimliğe sahip olmanız veya bir iş parçacığını göreve ayırmanız gerekir.

Ayrıca bkz.