ThreadPool Sınıf

Tanım

Görevleri yürütmek, iş öğelerini göndermek, zaman uyumsuz G/Ç'yi işlemek, diğer iş parçacıkları adına beklemek ve zamanlayıcıları işlemek için kullanılabilecek bir iş parçacığı havuzu sağlar.

public ref class ThreadPool sealed
public ref class ThreadPool abstract sealed
public sealed class ThreadPool
public static class ThreadPool
type ThreadPool = class
Public NotInheritable Class ThreadPool
Public Class ThreadPool
Devralma
ThreadPool

Örnekler

Aşağıdaki örnekte, ana uygulama iş parçacığı bir iş parçacığı havuzu iş parçacığında yürütmek için adlı ThreadProc bir yöntemi kuyruğa alır, bir saniye uyku moduna alır ve sonra çıkar. ThreadProc yöntemi yalnızca bir ileti görüntüler.

using System;
using System.Threading;

public class Example 
{
    public static void Main() 
    {
        // Queue the task.
        ThreadPool.QueueUserWorkItem(ThreadProc);
        Console.WriteLine("Main thread does some work, then sleeps.");
        Thread.Sleep(1000);

        Console.WriteLine("Main thread exits.");
    }

    // This thread procedure performs the task.
    static void ThreadProc(Object stateInfo) 
    {
        // No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.");
    }
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.
Imports System.Threading

Public Module Example
    Public Sub Main()
        ' Queue the work for execution.
        ThreadPool.QueueUserWorkItem(AddressOf ThreadProc)
        
        Console.WriteLine("Main thread does some work, then sleeps.")

        Thread.Sleep(1000)

        Console.WriteLine("Main thread exits.")
    End Sub

    ' This thread procedure performs the task.
    Sub ThreadProc(stateInfo As Object)
        ' No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.")
    End Sub
End Module
' The example displays output like the following:
'       Main thread does some work, then sleeps.
'       Hello from the thread pool.
'       Main thread exits.

Yöntemine yapılan çağrıyı Thread.Sleep açıklama satırı yaparsanız, yöntem iş parçacığı havuzu iş parçacığında çalışmadan önce ana iş parçacığından çıkar. İş parçacığı havuzu, tüm ön plan iş parçacıkları sonlandırıldıysa uygulamayı çalışır durumda tutmayan arka plan iş parçacıklarını kullanır. (Bu, bir yarış durumunun basit bir örneğidir.)

Açıklamalar

Birçok uygulama, bir olayın gerçekleşmesini bekleyerek uyku durumunda çok fazla zaman harcayan iş parçacıkları oluşturur. Diğer iş parçacıkları, yalnızca belirli aralıklarla bir değişiklik yoklaması yapmak veya durum bilgilerini güncelleştirmek için uyku durumuna girebilir. İş parçacığı havuzu, uygulamanıza sistem tarafından yönetilen bir çalışan iş parçacığı havuzu sağlayarak iş parçacıklarını daha verimli bir şekilde kullanmanızı sağlar. İş parçacığı havuzu iş parçacıkları kullanan işlemlere örnek olarak şunlar verilebilir:

  • Bir görevi zaman uyumsuz olarak gerçekleştirmek için bir Task veya Task<TResult> nesnesi oluşturduğunuzda, varsayılan olarak görev iş parçacığı havuzu iş parçacığında çalışacak şekilde zamanlanır.

  • Zaman uyumsuz zamanlayıcılar iş parçacığı havuzunu kullanır. İş parçacığı havuzu iş parçacıkları sınıfından System.Threading.Timer geri çağırmalar yürütür ve sınıfından System.Timers.Timer olaylar oluşturur.

  • Kayıtlı bekleme tanıtıcılarını kullandığınızda, sistem iş parçacığı bekleme tutamaçlarının durumunu izler. Bekleme işlemi tamamlandığında, iş parçacığı havuzundan bir çalışan iş parçacığı karşılık gelen geri çağırma işlevini yürütür.

  • bir iş parçacığı havuzu iş parçacığında QueueUserWorkItem yürütülecek bir yöntemi kuyruğa almak için yöntemini çağırdığınızda. Bunu, yöntemini bir WaitCallback temsilci geçirerek yaparsınız. Temsilci imzaya sahip

    void WaitCallback(Object state)
    
    Sub WaitCallback(state As Object)
    

    burada state , temsilci tarafından kullanılacak verileri içeren bir nesnedir. Gerçek veriler, yöntemi çağrılarak temsilciye QueueUserWorkItem(WaitCallback, Object) geçirilebilir.

Note

Yönetilen iş parçacığı havuzundaki iş parçacıkları arka plan iş parçacıklarıdır. Yani, özellikleri IsBackground şeklindedir true. Bu, ThreadPool tüm ön plan iş parçacıkları çıktıktan sonra bir iş parçacığının bir uygulamayı çalışır durumda tutmayacağı anlamına gelir.

Important

İş parçacığı havuzu bir iş parçacığını yeniden kullanırken, iş parçacığı yerel depolama alanındaki veya özniteliğiyle işaretlenmiş alanlardaki ThreadStaticAttribute verileri temizlemez. Bu nedenle, bir yöntem iş parçacığı yerel depolama alanını veya özniteliğiyle ThreadStaticAttribute işaretlenmiş alanları incelediğinde, bulduğu değerler iş parçacığı havuzu iş parçacığının daha önceki bir kullanımından bırakılabilir.

Ayrıca, iş parçacığı havuzuna yönelik bekleme işlemiyle ilgili olmayan iş öğelerini de kuyruğa alabilirsiniz. bir iş öğesinin iş parçacığı havuzundaki bir iş parçacığı tarafından işlenmesini istemek için yöntemini çağırın QueueUserWorkItem . Bu yöntem, iş parçacığı havuzundan seçilen iş parçacığı tarafından çağrılacak yönteme veya temsilciye bir başvuru parametresi olarak alır. Bir iş öğesi kuyruğa alındıktan sonra iptal etmenin bir yolu yoktur.

Zamanlayıcı kuyruğu zamanlayıcıları ve kayıtlı bekleme işlemleri de iş parçacığı havuzunu kullanır. Geri çağırma işlevleri iş parçacığı havuzuna kuyruğa alınır.

İşlem başına bir iş parçacığı havuzu vardır. .NET Framework 4'te başlayarak, 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 GetMaxThreads yöntemini çağırabilir. İş parçacığı havuzundaki iş parçacığı sayısı yöntemi kullanılarak SetMaxThreads değiştirilebilir. Her iş parçacığı varsayılan yığın boyutunu kullanır ve varsayılan önceliğe göre çalışır.

Note

.NET Framework'ü barındıran yönetilmeyen kod, mscoree.h dosyasında tanımlanan CorSetMaxThreads işlevini kullanarak iş parçacığı havuzunun boyutunu değiştirebilir.

İş parçacığı havuzu, her kategori için maksimum 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. Bir üst sınıra ulaşıldığında, iş parçacığı havuzu bu kategoride ek iş parçacıkları oluşturabilir veya bazı görevlerin tamamlanmasını bekleyebilir. .NET Framework 4'le başlayarak iş 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 işlem, 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.

Note

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

Bu en düşük değerleri almak için yöntemini kullanabilirsiniz GetMinThreads .

Caution

en az iş parçacığı sayısını artırmak için yöntemini kullanabilirsiniz 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.

Yöntemler

Name Description
BindHandle(IntPtr)
Geçersiz.

bir işletim sistemi tanıtıcısını öğesine ThreadPoolbağlar.

BindHandle(SafeHandle)

bir işletim sistemi tanıtıcısını öğesine ThreadPoolbağlar.

GetAvailableThreads(Int32, Int32)

yöntemi tarafından GetMaxThreads(Int32, Int32) döndürülen iş parçacığı havuzu iş parçacığı sayısı üst sınırı ile şu anda etkin olan sayı arasındaki farkı alır.

GetMaxThreads(Int32, Int32)

İş parçacığı havuzuna eşzamanlı olarak etkin olabilecek istek sayısını alır. İş parçacığı havuzu iş parçacıkları kullanılabilir duruma gelene kadar bu sayın üzerindeki tüm istekler kuyruğa alınmış olarak kalır.

GetMinThreads(Int32, Int32)

İş parçacığı oluşturma ve yok etme işlemini yönetmek için bir algoritmaya geçmeden önce, yeni istekler yapıldıktan sonra iş parçacığı havuzunun isteğe bağlı olarak oluşturduğu en az iş parçacığı sayısını alır.

QueueUserWorkItem(WaitCallback, Object)

Yürütme için bir yöntemi kuyruğa alır ve yöntemi tarafından kullanılacak verileri içeren bir nesneyi belirtir. bir iş parçacığı havuzu iş parçacığı kullanılabilir olduğunda yöntemi yürütülür.

QueueUserWorkItem(WaitCallback)

Yürütme için bir yöntem kuyruğa alır. bir iş parçacığı havuzu iş parçacığı kullanılabilir olduğunda yöntemi yürütülür.

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)

Yürütme için bir temsilci tarafından belirtilen bir Action<T> yöntemi kuyruğa alır ve yöntemi tarafından kullanılacak verileri sağlar. bir iş parçacığı havuzu iş parçacığı kullanılabilir olduğunda yöntemi yürütülür.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Zaman aşımı için WaitHandlemilisaniye cinsinden 32 bit imzalı bir tamsayı belirterek bir temsilcisini bekler.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Zaman aşımı için WaitHandlemilisaniye cinsinden 64 bit imzalı bir tamsayı belirterek bir temsilcisini bekler.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Zaman aşımı için bir değer belirterek beklemesi için WaitHandlebir TimeSpan temsilci kaydeder.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Zaman aşımı için milisaniye cinsinden 32 bit işaretsiz bir tamsayı belirten bir WaitHandletemsilciyi beklemesi için kaydeder.

SetMaxThreads(Int32, Int32)

İş parçacığı havuzuna eşzamanlı olarak etkin olabilecek istek sayısını ayarlar. İş parçacığı havuzu iş parçacıkları kullanılabilir duruma gelene kadar bu sayın üzerindeki tüm istekler kuyruğa alınmış olarak kalır.

SetMinThreads(Int32, Int32)

İş parçacığı oluşturma ve yok etme yönetimine yönelik bir algoritmaya geçmeden önce, yeni istekler yapıldıktan sonra iş parçacığı havuzunun isteğe bağlı olarak oluşturduğu iş parçacığı sayısını ayarlar.

UnsafeQueueNativeOverlapped(NativeOverlapped*)

Yürütme için çakışan G/Ç işlemini kuyruğa alır.

UnsafeQueueUserWorkItem(WaitCallback, Object)

Belirtilen temsilciyi iş parçacığı havuzuna kuyruğa alır, ancak çağrı yığınını çalışan iş parçacığına yaymaz.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Milisaniye cinsinden zaman aşımı için WaitHandle32 bit imzalı tamsayı kullanarak bir temsilciyi bekler. Bu yöntem çağrı yığınını çalışan iş parçacığına yaymıyor.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Zaman aşımı için WaitHandlemilisaniye cinsinden 64 bit imzalı bir tamsayı belirterek bir temsilcisini bekler. Bu yöntem çağrı yığınını çalışan iş parçacığına yaymıyor.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Zaman aşımı için bir değer belirterek beklemesi için WaitHandlebir TimeSpan temsilci kaydeder. Bu yöntem çağrı yığınını çalışan iş parçacığına yaymıyor.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Zaman aşımı için milisaniye cinsinden 32 bit işaretsiz bir tamsayı belirten bir WaitHandletemsilciyi beklemesi için kaydeder. Bu yöntem çağrı yığınını çalışan iş parçacığına yaymıyor.

Şunlara uygulanır

İş Parçacığı Güvenliği

Bu tür iş parçacığı güvenlidir.

Ayrıca bkz.