Bagikan melalui


Pool utas yang dikelola

Kelas System.Threading.ThreadPool menyediakan aplikasi Anda dengan kumpulan utas pekerja yang dikelola oleh sistem, agar Anda dapat lebih fokus pada tugas aplikasi daripada pengelolaan utas. Jika Anda memiliki tugas singkat yang memerlukan pemrosesan latar belakang, kumpulan utas terkelola adalah cara mudah untuk memanfaatkan beberapa utas. Penggunaan kumpulan utas menjadi jauh lebih mudah di Framework 4 dan versi yang lebih baru, karena Anda dapat membuat objek Task dan Task<TResult> untuk melakukan tugas asinkron pada utas tersebut.

.NET menggunakan thread dari kumpulan thread untuk berbagai keperluan, termasuk operasi Pustaka Paralel Tugas (TPL), penyelesaian I/O asinkron, callback timer, operasi tunggu terdaftar, panggilan metode asinkron yang menggunakan delegasi, dan koneksi soket System.Net.

Karakteristik kolam utas

Utas-utas dalam kumpulan utas adalah utas latar belakang. Setiap thread menggunakan ukuran tumpukan default, berjalan pada prioritas default, dan berada dalam lingkungan pemrosesan multithread. Setelah utas di kumpulan utas menyelesaikan tugasnya, utas tersebut diterima kembali ke antrean utas yang menunggu. Mulai saat ini dapat digunakan kembali. Penggunaan kembali ini memungkinkan aplikasi untuk menghindari overhead membuat thread baru untuk setiap tugas.

Hanya ada satu kumpulan utas untuk setiap proses.

Pengecualian dalam utas kumpulan utas

Pengecualian yang tidak tertangani pada utas dalam kumpulan utas akan menghentikan proses. Ada tiga pengecualian untuk aturan ini:

Untuk informasi selengkapnya, lihat Pengecualian pada Utas yang Dikelola.

Jumlah maksimum utas kumpulan utas

Jumlah operasi yang dapat diantrekan ke kumpulan utas hanya dibatasi oleh memori yang tersedia. Namun, kumpulan utas membatasi jumlah utas yang dapat aktif dalam proses secara bersamaan. Jika semua thread di kumpulan thread sibuk, item kerja tambahan akan masuk antrean hingga thread yang mengeksekusinya tersedia. Ukuran default kumpulan utas untuk proses tergantung pada beberapa faktor, seperti ukuran ruang alamat virtual. Proses dapat memanggil metode ThreadPool.GetMaxThreads untuk menentukan jumlah utas.

Anda dapat mengontrol jumlah maksimum utas dengan menggunakan metode ThreadPool.GetMaxThreads dan ThreadPool.SetMaxThreads.

Nota

Kode yang menjalankan runtime bahasa umum dapat mengatur ukuran menggunakan metode ICorThreadpool::CorSetMaxThreads.

Jumlah minimum kumpulan utas

Kumpulan utas menyediakan utas pekerja baru atau utas penyelesaian I/O sesuai permintaan hingga mencapai minimum yang ditentukan untuk setiap kategori. Anda dapat menggunakan ThreadPool.GetMinThreads metode untuk mendapatkan nilai minimum ini.

Nota

Ketika permintaan rendah, jumlah aktual utas kumpulan utas dapat berada di bawah nilai minimum.

Ketika minimum tercapai, kumpulan utas dapat membuat utas tambahan atau menunggu hingga beberapa tugas selesai. Kumpulan utas membuat dan menghapuskan 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.

Perhatian

Anda dapat menggunakan metode ThreadPool.SetMinThreads untuk meningkatkan jumlah minimum thread menganggur. 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.

Menggunakan kumpulan utas

Cara termudah untuk menggunakan kolam utas adalah dengan menggunakan Pustaka Paralel Tugas (TPL). Secara bawaan, jenis TPL seperti Task dan Task<TResult> menggunakan thread pool untuk menjalankan tugas.

Anda juga dapat menggunakan kumpulan utas dengan memanggil ThreadPool.QueueUserWorkItem dari kode terkelola (atau ICorThreadpool::CorQueueUserWorkItem dari kode yang tidak dikelola) dan meneruskan delegasi System.Threading.WaitCallback yang mewakili metode yang melakukan tugas tersebut.

Cara lain untuk menggunakan kumpulan utas adalah dengan mengantre item kerja yang terkait dengan operasi tunggu dengan menggunakan ThreadPool.RegisterWaitForSingleObject metode dan meneruskan System.Threading.WaitHandle yang, ketika diberi sinyal atau ketika waktu habis, memanggil metode yang diwakili oleh System.Threading.WaitOrTimerCallback delegasi. Utas kumpulan utas digunakan untuk memanggil metode panggilan balik.

Untuk contohnya, periksa halaman API yang dirujuk.

Melewati pemeriksaan keamanan

Kumpulan utas juga menyediakan metode ThreadPool.UnsafeQueueUserWorkItem dan ThreadPool.UnsafeRegisterWaitForSingleObject. Gunakan metode ini hanya ketika Anda yakin bahwa stack pemanggil tidak relevan dengan pemeriksaan keamanan apa pun yang dilakukan selama eksekusi tugas yang diantrekan. ThreadPool.QueueUserWorkItem dan ThreadPool.RegisterWaitForSingleObject keduanya menangkap stack pemanggil, yang digabungkan ke dalam stack utas kumpulan ketika utas mulai menjalankan tugas. Jika pemeriksaan keamanan diperlukan, seluruh tumpukan harus diperiksa. Meskipun pemeriksaan menawarkan keamanan, hal ini juga memiliki biaya terhadap performa.

Kapan sebaiknya tidak menggunakan thread dari pool thread

Ada beberapa skenario di mana sesuai untuk membuat dan mengelola utas Anda sendiri alih-alih menggunakan utas kumpulan utas:

  • Anda memerlukan utas latar depan.
  • Anda memerlukan thread dengan prioritas tertentu.
  • Anda memiliki tugas yang menyebabkan utas diblokir untuk jangka waktu yang lama. Kumpulan utas memiliki jumlah maksimum utas, sehingga banyak utas yang diblokir dalam kumpulan utas mungkin mencegah tugas dimulai.
  • Anda perlu menempatkan utas ke dalam apartemen berulir tunggal. Semua ThreadPool utas berada di apartemen multibenang.
  • Anda perlu memiliki identitas yang stabil yang terkait dengan utas atau mengalokasikan utas untuk tugas tertentu.

Lihat juga