ThreadPool Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menyediakan kumpulan utas yang dapat digunakan untuk menjalankan tugas, memposting item kerja, memproses I/O asinkron, menunggu atas nama utas lain, dan timer proses.
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
- Warisan
-
ThreadPool
Contoh
Dalam contoh berikut, utas aplikasi utama mengantrekan metode bernama ThreadProc untuk dijalankan pada utas kumpulan utas, tidur selama satu detik, lalu keluar. Metode ThreadProc ini hanya menampilkan pesan.
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.
Jika Anda mengomentari panggilan ke Thread.Sleep metode , utas utama keluar sebelum metode berjalan pada utas kumpulan utas. Kumpulan utas menggunakan utas latar belakang, yang tidak menjaga aplikasi tetap berjalan jika semua utas latar depan telah dihentikan. (Ini adalah contoh sederhana dari kondisi balapan.)
Keterangan
Banyak aplikasi membuat utas yang menghabiskan banyak waktu dalam keadaan tidur, menunggu peristiwa terjadi. Utas lain mungkin memasuki status tidur hanya untuk dibangunkan secara berkala untuk polling untuk informasi status perubahan atau pembaruan. Kumpulan utas memungkinkan Anda menggunakan utas secara lebih efisien dengan menyediakan kumpulan utas pekerja yang dikelola oleh sistem kepada aplikasi Anda. Contoh operasi yang menggunakan utas kumpulan utas meliputi yang berikut ini:
Saat Anda membuat Task objek atau Task<TResult> untuk melakukan beberapa tugas secara asinkron, secara default tugas dijadwalkan untuk dijalankan pada utas kumpulan utas.
Timer asinkron menggunakan kumpulan utas. Utas kumpulan utas menjalankan panggilan balik dari System.Threading.Timer kelas dan menaikkan peristiwa dari System.Timers.Timer kelas .
Saat Anda menggunakan handel tunggu terdaftar, utas sistem memantau status handel tunggu. Ketika operasi tunggu selesai, utas pekerja dari kumpulan utas menjalankan fungsi panggilan balik yang sesuai.
Ketika Anda memanggil QueueUserWorkItem metode untuk mengantrekan metode untuk eksekusi pada utas kumpulan utas. Anda melakukan ini dengan meneruskan metode delegasi WaitCallback . Delegasi memiliki tanda tangan
void WaitCallback(Object state)Sub WaitCallback(state As Object)di mana
stateadalah objek yang berisi data yang akan digunakan oleh delegasi. Data aktual dapat diteruskan ke delegasi dengan memanggil QueueUserWorkItem(WaitCallback, Object) metode .
Note
Utas di kumpulan utas terkelola adalah utas latar belakang. Artinya, properti mereka IsBackground adalah true. Ini berarti bahwa ThreadPool utas tidak akan menjaga aplikasi tetap berjalan setelah semua utas latar depan keluar.
Important
Saat kumpulan utas menggunakan kembali utas, kumpulan utas tidak menghapus data di penyimpanan lokal utas atau di bidang yang ditandai dengan ThreadStaticAttribute atribut . Oleh karena itu, ketika metode memeriksa penyimpanan lokal utas atau bidang yang ditandai dengan ThreadStaticAttribute atribut , nilai yang ditemukannya mungkin tersisa dari penggunaan utas kumpulan utas sebelumnya.
Anda juga dapat mengantre item kerja yang tidak terkait dengan operasi tunggu ke kumpulan utas. Untuk meminta agar item kerja ditangani oleh utas di kumpulan utas, panggil QueueUserWorkItem metode . Metode ini mengambil sebagai parameter referensi ke metode atau delegasi yang akan dipanggil oleh utas yang dipilih dari kumpulan utas. Tidak ada cara untuk membatalkan item kerja setelah diantrekan.
Timer-queue timer dan operasi tunggu terdaftar juga menggunakan kumpulan utas. Fungsi panggilan balik mereka diantrekan ke kumpulan utas.
Ada satu kumpulan utas per proses. Dimulai dengan .NET Framework 4, ukuran default kumpulan utas untuk proses tergantung pada beberapa faktor, seperti ukuran ruang alamat virtual. Proses dapat memanggil metode GetMaxThreads untuk menentukan jumlah utas. Jumlah utas di kumpulan utas dapat diubah dengan menggunakan SetMaxThreads metode . Setiap utas menggunakan ukuran tumpukan default dan berjalan pada prioritas default.
Note
Kode tidak terkelola yang menghosting .NET Framework dapat mengubah ukuran kumpulan utas dengan menggunakan fungsi CorSetMaxThreads, yang ditentukan dalam file mscoree.h.
Kumpulan utas menyediakan utas pekerja baru atau utas penyelesaian I/O sesuai permintaan hingga mencapai maksimum untuk setiap kategori. Ketika maksimum tercapai, kumpulan utas dapat membuat utas tambahan dalam kategori tersebut atau menunggu hingga beberapa tugas selesai. Dimulai dengan .NET Framework 4, kumpulan utas membuat dan menghancurkan utas pekerja untuk mengoptimalkan throughput, yang didefinisikan sebagai jumlah tugas yang selesai per unit waktu. Terlalu sedikit utas mungkin tidak memanfaatkan sumber daya yang tersedia secara optimal, namun terlalu banyak utas dapat meningkatkan perebutan sumber daya.
Note
Ketika permintaan rendah, jumlah aktual utas kumpulan utas dapat berada di bawah nilai minimum.
Anda dapat menggunakan GetMinThreads metode untuk mendapatkan nilai minimum ini.
Caution
Anda dapat menggunakan SetMinThreads metode untuk meningkatkan jumlah minimum utas. Namun, peningkatan yang tidak perlu terhadap nilai-nilai ini dapat menyebabkan masalah performa. Jika terlalu banyak tugas dimulai pada saat yang sama, semuanya mungkin tampak lambat. Dalam kebanyakan kasus, kumpulan utas akan berkinerja lebih baik dengan algoritmanya sendiri untuk mengalokasikan utas.
Properti
| Nama | Deskripsi |
|---|---|
| CompletedWorkItemCount |
Mendapatkan jumlah item kerja yang telah diproses sejauh ini. |
| PendingWorkItemCount |
Mendapatkan jumlah item kerja yang saat ini diantrekan untuk diproses. |
| ThreadCount |
Mendapatkan jumlah utas kumpulan utas yang saat ini ada. |
Metode
| Nama | Deskripsi |
|---|---|
| BindHandle(IntPtr) |
Kedaluwarsa.
Kedaluwarsa.
Mengikat handel sistem operasi ke ThreadPool. |
| BindHandle(SafeHandle) |
Mengikat handel sistem operasi ke ThreadPool. |
| GetAvailableThreads(Int32, Int32) |
Mengambil perbedaan antara jumlah maksimum utas kumpulan utas yang dikembalikan oleh GetMaxThreads(Int32, Int32) metode , dan angka yang saat ini aktif. |
| GetMaxThreads(Int32, Int32) |
Mengambil jumlah permintaan ke kumpulan utas yang dapat aktif secara bersamaan. Semua permintaan di atas jumlah tersebut tetap diantrekan hingga utas kumpulan utas tersedia. |
| GetMinThreads(Int32, Int32) |
Mengambil jumlah minimum utas yang dibuat kumpulan utas sesuai permintaan, karena permintaan baru dibuat, sebelum beralih ke algoritma untuk mengelola pembuatan dan penghancuran utas. |
| QueueUserWorkItem(WaitCallback, Object) |
Mengantrekan metode untuk eksekusi, dan menentukan objek yang berisi data yang akan digunakan oleh metode . Metode ini dijalankan ketika utas kumpulan utas tersedia. |
| QueueUserWorkItem(WaitCallback) |
Mengantrekan metode untuk eksekusi. Metode ini dijalankan ketika utas kumpulan utas tersedia. |
| QueueUserWorkItem<TState>(Action<TState>, TState, Boolean) |
Mengantrekan metode yang ditentukan oleh Action<T> delegasi untuk eksekusi, dan menyediakan data yang akan digunakan oleh metode . Metode ini dijalankan ketika utas kumpulan utas tersedia. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Mendaftarkan delegasi untuk menunggu WaitHandle, menentukan bilangan bulat yang ditandatangani 32-bit untuk waktu habis dalam milidetik. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Mendaftarkan delegasi untuk WaitHandlemenunggu , menentukan bilangan bulat yang ditandatangani 64-bit untuk waktu habis dalam milidetik. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Mendaftarkan delegasi untuk WaitHandlemenunggu , menentukan TimeSpan nilai untuk waktu habis. |
| RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Mendaftarkan delegasi untuk WaitHandlemenunggu , menentukan bilangan bulat yang tidak ditandatangani 32-bit untuk waktu habis dalam milidetik. |
| SetMaxThreads(Int32, Int32) |
Mengatur jumlah permintaan ke kumpulan utas yang dapat aktif secara bersamaan. Semua permintaan di atas jumlah tersebut tetap diantrekan hingga utas kumpulan utas tersedia. |
| SetMinThreads(Int32, Int32) |
Mengatur jumlah minimum utas yang dibuat kumpulan utas sesuai permintaan, karena permintaan baru dibuat, sebelum beralih ke algoritma untuk mengelola pembuatan dan penghancuran utas. |
| UnsafeQueueNativeOverlapped(NativeOverlapped*) |
Mengantre operasi I/O yang tumpang tindih untuk eksekusi. |
| UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean) |
Mengantrekan objek item kerja yang ditentukan ke kumpulan utas. |
| UnsafeQueueUserWorkItem(WaitCallback, Object) |
Mengantrekan delegasi yang ditentukan ke kumpulan utas, tetapi tidak menyebarluaskan tumpukan panggilan ke utas pekerja. |
| UnsafeQueueUserWorkItem<TState>(Action<TState>, TState, Boolean) |
Mengantrekan metode yang ditentukan oleh Action<T> delegasi untuk eksekusi, dan menentukan objek yang berisi data yang akan digunakan oleh metode . Metode ini dijalankan ketika utas kumpulan utas tersedia. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) |
Mendaftarkan delegasi untuk WaitHandlemenunggu , menggunakan bilangan bulat yang ditandatangani 32-bit untuk waktu habis dalam milidetik. Metode ini tidak menyebarluaskan tumpukan panggilan ke utas pekerja. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) |
Mendaftarkan delegasi untuk WaitHandlemenunggu , menentukan bilangan bulat yang ditandatangani 64-bit untuk waktu habis dalam milidetik. Metode ini tidak menyebarluaskan tumpukan panggilan ke utas pekerja. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) |
Mendaftarkan delegasi untuk WaitHandlemenunggu , menentukan TimeSpan nilai untuk waktu habis. Metode ini tidak menyebarluaskan tumpukan panggilan ke utas pekerja. |
| UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) |
Mendaftarkan delegasi untuk WaitHandlemenunggu , menentukan bilangan bulat yang tidak ditandatangani 32-bit untuk waktu habis dalam milidetik. Metode ini tidak menyebarluaskan tumpukan panggilan ke utas pekerja. |
Berlaku untuk
Keamanan Thread
Jenis ini aman untuk utas.