Memahami kumpulan benang di C #

Utas adalah unit eksekusi terkecil dalam suatu proses. Kumpulan utas terdiri dari sejumlah utas, atau, kumpulan utas tepatnya, dan dapat digunakan untuk melakukan beberapa aktivitas di latar belakang.

Mengapa saya harus menggunakan kumpulan benang?

Untaian mahal karena menghabiskan banyak sumber daya di sistem Anda untuk inisialisasi, beralih konteks, dan melepaskan sumber daya yang ditempati. Biasanya, saat thread melakukan operasi I / O (penanganan file, operasi database atau mengakses sumber jaringan, dll.), Thread diblokir oleh sistem operasi hingga operasi I / O selesai. Thread akan melanjutkan operasi CPU-nya setelah operasi I / O-nya selesai.

Kumpulan utas adalah pilihan yang baik ketika Anda ingin membatasi jumlah utas yang berjalan pada titik waktu tertentu dan ingin menghindari overhead pembuatan dan penghancuran utas dalam aplikasi Anda. Ini juga merupakan pilihan yang baik bila Anda memiliki banyak tugas dalam aplikasi Anda yang perlu dijalankan secara paralel atau bersamaan dan Anda ingin meningkatkan daya tanggap aplikasi dengan menghindari pengalih konteks. Untuk membuat kumpulan utas, Anda dapat memanfaatkan kelas System.Threading.ThreadPool.

Cuplikan kode berikut menunjukkan bagaimana Anda dapat menyetel jumlah minimum utas di kumpulan utas.

ThreadPool.SetMinThreads (50, 50);

Namun, perhatikan bahwa ketika tugas yang berjalan lama sedang dijalankan, thread pool thread mungkin diblokir untuk waktu yang lama. Untuk memperburuk keadaan, permintaan masuk yang bergantung pada utas dari kumpulan utas mungkin ditahan atau bahkan mungkin ditolak terutama karena kumpulan utas mungkin tidak memiliki utas yang tersedia untuk menangani permintaan masuk. Kumpulan utas juga bukan pilihan yang baik jika Anda memiliki utas yang berbeda dalam prioritasnya atau Anda mungkin perlu membatalkan utas sebelum waktunya. Penghentian thread yang prematur menyiratkan bahwa thread telah dihentikan secara paksa sebelum waktu penyelesaiannya berakhir.

Bagaimana cara kerja kumpulan utas?

Intinya, saat bekerja dengan kumpulan utas, Anda biasanya akan membuat kumpulan utas dan menyimpannya di kumpulan utas sebelum menggunakan utas dalam aplikasi Anda. Saat dan saat Anda membutuhkan utas, Anda akan menggunakan kembali utas tersebut daripada membuat utas baru setiap kali aplikasi perlu menggunakan utas.

Jadi, aplikasi akan membuat permintaan ke kumpulan utas untuk mendapatkan utas darinya, melakukan aktivitas menggunakan utas dan kemudian mengembalikan utas kembali ke kumpulan utas setelah selesai. Kumpulan utas berguna dalam situasi ketika Anda memiliki lebih banyak tugas untuk dijalankan daripada Anda dapat membuat utas (ada batasan jumlah maksimum utas yang dapat Anda buat per proses) dalam aplikasi Anda.

Bagaimana cara mengoptimalkan kumpulan utas?

Ketika suatu proses dimulai, itu dialokasikan kumpulan utas oleh CLR. Perhatikan bahwa Anda dapat mengonfigurasi ukuran kumpulan utas jika perlu. Runtime mengelola kumpulan utas dengan cerdas. Saat kumpulan utas dimulai, hanya ada satu utas di kumpulan utas. Sejak saat itu, pengelola kumpulan utas (komponen yang bertanggung jawab untuk mengelola kumpulan utas) membuat lebih banyak utas dan menyimpannya di kumpulan utas saat beban pada aplikasi meningkat, yaitu, aplikasi membutuhkan lebih banyak tugas untuk dieksekusi secara bersamaan.

Jumlah utas yang dapat tersedia di kumpulan utas pada titik waktu tertentu diatur oleh batas maksimum utas yang diizinkan di kumpulan utas. Dengan kata lain, jumlah utas yang tersedia di kumpulan utas bervariasi dari waktu ke waktu tergantung pada konsumsi utas oleh aplikasi. Segera setelah batas maksimum (jumlah maksimum utas di kumpulan utas) tercapai, aplikasi membuat utas baru jauh lebih jarang.

Anda selalu dapat mengatur sendiri batas atas utas yang diizinkan di kumpulan utas jika perlu. Untuk melakukan ini, Anda harus memanfaatkan properti ThreadPool.SetMaxThreads. Untuk menyetel batas bawah utas di kumpulan utas, Anda dapat menggunakan properti ThreadPool.SetMinThreads. Batas bawah default untuk jumlah utas di kumpulan utas adalah satu utas per prosesor.