Kumpulan alur terkelola

Kelas System.Threading.ThreadPool menyediakan aplikasi Anda dengan kumpulan utas pekerja yang dikelola oleh sistem, memungkinkan Anda untuk berkonsentrasi pada tugas aplikasi, bukan manajemen utas. Jika Anda memiliki tugas singkat yang memerlukan pemrosesan latar belakang, kumpulan utas terkelola adalah cara mudah untuk memanfaatkan beberapa utas. Penggunaan kumpulan utas secara signifikan lebih mudah di Framework 4 dan yang lebih baru, karena Anda dapat membuat objek Task dan Task<TResult> yang melakukan tugas asinkron pada utas kumpulan utas.

.NET menggunakan utas kumpulan utas untuk banyak tujuan, termasuk operasi Pustaka Paralel Tugas (TPL), penyelesaian I/O asinkron, panggilan balik timer, operasi tunggu terdaftar, panggilan metode asinkron menggunakan delegasi, dan koneksi soket System.Net.

Karakteristik kumpulan utas

Utas kumpulan utas adalah utas latar belakang. Setiap utas menggunakan ukuran tumpukan default, berjalan pada prioritas default, dan berada di apartemen berutas-jamak. Setelah utas di kumpulan utas menyelesaikan tugasnya, utas dikembalikan ke antrean utas tunggu. Dari waktu ini utas tersebut dapat digunakan kembali. Penggunaan kembali ini memungkinkan aplikasi untuk menghindari biaya pembuatan utas baru untuk setiap tugas.

Hanya ada satu kumpulan utas per proses.

Pengecualian dalam utas kumpulan utas

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

Untuk informasi selengkapnya, lihat Pengecualian dalam Utas Terkelola.

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 utas kumpulan utas sibuk, item kerja tambahan diantrekan hingga utas yang akan 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.

Catatan

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

Minimum kumpulan utas

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

Catatan

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 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, sedangkan terlalu banyak utas dapat meningkatkan ketidakcocokan sumber daya.

Perhatian

Anda dapat menggunakan metode ThreadPool.SetMinThreads untuk meningkatkan jumlah minimum utas diam. Namun, peningkatan nilai-nilai yang tidak perlu dapat menyebabkan masalah performa. Jika terlalu banyak tugas dimulai pada saat yang sama, semuanya mungkin akan menjadi lambat. Dalam kebanyakan kasus, kumpulan utas akan berkinerja lebih baik dengan algoritmanya sendiri untuk mengalokasikan utas.

Menggunakan kumpulan utas

Cara term mudah untuk menggunakan kumpulan utas adalah dengan menggunakan Pustaka Paralel Tugas (TPL). Secara default, jenis TPL seperti Task dan Task<TResult> menggunakan utas kumpulan utas 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.

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

Sebagai contohnya, periksa halaman API yang dirujuk.

Melompati pemeriksaan keamanan

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

Kapan tidak menggunakan utas kumpulan utas

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

  • Anda memerlukan utas latar depan.
  • Anda memerlukan utas untuk memiliki prioritas tertentu.
  • Anda memiliki tugas yang menyebabkan utas diblokir untuk jangka waktu yang lama. Kumpulan utas memiliki jumlah utas maksimum, sehingga sejumlah besar utas kumpulan utas yang diblokir mungkin mencegah tugas dimulai.
  • Anda perlu menempatkan utas ke dalam apartemen berutas-tunggal. Semua utas ThreadPool berada di apartemen berutas-jamak.
  • Anda harus memiliki identitas stabil yang terkait dengan utas, atau untuk mendedikasikan utas ke suatu tugas.

Lihat juga