ThreadPool Sınıf
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
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 abstract sealed
public ref class ThreadPool sealed
public static class ThreadPool
public sealed class ThreadPool
type ThreadPool = class
Public Class ThreadPool
Public NotInheritable 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ütülecek adlı ThreadProc
bir yöntemi kuyruğa alır, bir saniye uyku moduna girer ve sonra çıkar.
ThreadProc
yöntemi yalnızca bir ileti görüntüler.
using namespace System;
using namespace System::Threading;
ref class Example
{
public:
// This thread procedure performs the task.
static void ThreadProc(Object^ stateInfo)
{
// No state object was passed to QueueUserWorkItem, so stateInfo is 0.
Console::WriteLine( "Hello from the thread pool." );
}
};
int main()
{
// Queue the task.
ThreadPool::QueueUserWorkItem(gcnew WaitCallback(Example::ThreadProc));
Console::WriteLine("Main thread does some work, then sleeps.");
Thread::Sleep(1000);
Console::WriteLine("Main thread exits.");
return 0;
}
// The example displays output like the following:
// Main thread does some work, then sleeps.
// Hello from the thread pool.
// Main thread exits.
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ı 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ıftan 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 yürütme için bir yöntemi kuyruğa almak için yöntemini çağırdığınızda QueueUserWorkItem . Bunu yapmak için yöntemini bir WaitCallback temsilci geçirirsiniz. Temsilcinin imzası var
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.
Not
Yönetilen iş parçacığı havuzundaki iş parçacıkları arka plan iş parçacıklarıdır. Yani, özellikleri IsBackground şeklindedir true
. Bu, ön ThreadPool plan iş parçacıklarının tümü çıktıktan sonra bir iş parçacığının bir uygulamayı çalışır durumda tutmayacağı anlamına gelir.
Önemli
İş 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 kalmış olabilir.
Ayrıca, bekleme işlemiyle ilgili olmayan iş öğelerini iş parçacığı havuzuna 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, bir parametre olarak iş parçacığı havuzundan seçilen iş parçacığı tarafından çağrılacak yönteme veya temsilciye başvuru 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ıyor.
İş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 yöntemini çağırabilir GetMaxThreads . İş 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.
Not
.NET Framework barındıran yönetilmeyen kod, mscoree.h dosyasında tanımlanan işlevini kullanarak CorSetMaxThreads
iş parçacığı havuzunun boyutunu değiştirebilir.
İş parçacığı havuzu, her kategori için üst sınıra 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'ünden 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.
Not
Talep düşük olduğunda, gerçek iş parçacığı havuzu 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 .
Dikkat
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.
Özellikler
CompletedWorkItemCount |
Şimdiye kadar işlenen iş öğelerinin sayısını alır. |
PendingWorkItemCount |
İşlenmek üzere kuyruğa alınmış olan iş öğelerinin sayısını alır. |
ThreadCount |
Şu anda var olan iş parçacığı havuzu iş parçacığı sayısını alır. |
Yöntemler
BindHandle(IntPtr) |
Geçersiz.
Geçersiz.
bir işletim sistemi tanıtıcısını ThreadPoolöğesine bağlar. |
BindHandle(SafeHandle) |
bir işletim sistemi tanıtıcısını ThreadPoolöğesine bağlar. |
GetAvailableThreads(Int32, Int32) |
yöntemi tarafından GetMaxThreads(Int32, Int32) döndürülen en fazla iş parçacığı havuzu iş parçacığı sayısı 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) |
Yürütme için bir yöntemi kuyruğa alır. bir iş parçacığı havuzu iş parçacığı kullanılabilir olduğunda yöntemi yürütülü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<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 milisaniye cinsinden 32 bit imzalı bir tamsayı belirterek bir temsilciyi beklemesi için WaitHandlekaydeder. |
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Milisaniye cinsinden zaman aşımı için 64 bit imzalı bir tamsayı belirterek bir temsilciyi beklemesi için WaitHandlekaydeder. |
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Beklemesi için WaitHandlebir temsilci kaydeder ve zaman aşımı için bir TimeSpan değer belirtir. |
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Zaman aşımı için milisaniye cinsinden 32 bit işaretsiz bir tamsayı belirterek bir temsilciyi beklemesi için WaitHandlekaydeder. |
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 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ı ayarlar. |
UnsafeQueueNativeOverlapped(NativeOverlapped*) |
Çakışan G/Ç işlemini yürütme için kuyruğa alır. |
UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean) |
Belirtilen iş öğesi nesnesini iş parçacığı havuzuna kuyruğa alır. |
UnsafeQueueUserWorkItem(WaitCallback, Object) |
Belirtilen temsilciyi iş parçacığı havuzuna kuyruğa alır, ancak çağıran yığını çalışan iş parçacığına yaymaz. |
UnsafeQueueUserWorkItem<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 içeren bir nesneyi belirtir. bir iş parçacığı havuzu iş parçacığı kullanılabilir olduğunda yöntemi yürütülür. |
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Milisaniye cinsinden zaman aşımı için 32 bit imzalı tamsayı kullanarak bir temsilciyi beklemesi için WaitHandlekaydeder. Bu yöntem çağıran yığını çalışan iş parçacığına yaymaz. |
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Milisaniye cinsinden zaman aşımı için 64 bit imzalı bir tamsayı belirterek bir temsilciyi beklemesi için WaitHandlekaydeder. Bu yöntem çağıran yığını çalışan iş parçacığına yaymaz. |
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Beklemesi için WaitHandlebir temsilci kaydeder ve zaman aşımı için bir TimeSpan değer belirtir. Bu yöntem çağıran yığını çalışan iş parçacığına yaymaz. |
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Zaman aşımı için milisaniye cinsinden 32 bit işaretsiz bir tamsayı belirterek bir temsilciyi beklemesi için WaitHandlekaydeder. Bu yöntem çağıran yığını çalışan iş parçacığına yaymaz. |
Şunlara uygulanır
İş Parçacığı Güvenliği
Bu güvenli iş parçacığı türüdür.