Memahami kumpulan benang dalam C #

Benang adalah unit pelaksanaan terkecil dalam proses. Kumpulan utas terdiri dari sejumlah utas, atau, kumpulan utas yang tepat, dan dapat digunakan untuk melakukan beberapa kegiatan di latar belakang.

Mengapa saya mesti menggunakan kumpulan benang?

Benang itu mahal kerana mereka menghabiskan banyak sumber dalam sistem anda untuk memulakan, menukar konteks, dan melepaskan sumber yang mereka gunakan. Biasanya, semasa utas melakukan operasi I / O (pengendalian fail, operasi pangkalan data atau mengakses sumber rangkaian, dll.) Utas disekat oleh sistem operasi sehingga operasi I / O selesai. Benang akan meneruskan operasi CPUnya setelah operasi I / O selesai.

Kumpulan utas adalah pilihan yang baik apabila anda ingin mengehadkan bilangan utas yang berjalan pada waktu tertentu dan ingin mengelakkan overhead membuat dan menghancurkan benang dalam aplikasi anda. Ini juga merupakan pilihan yang baik apabila anda mempunyai banyak tugas dalam aplikasi anda yang perlu dilaksanakan sama ada secara selari atau bersamaan dan anda ingin meningkatkan respons aplikasi dengan mengelakkan perubahan konteks. Untuk membuat kumpulan utas, anda boleh memanfaatkan kelas System.Threading.ThreadPool.

Coretan kod berikut menunjukkan bagaimana anda boleh menetapkan bilangan utas minimum dalam kumpulan utas.

ThreadPool.SetMinThreads (50, 50);

Walau bagaimanapun, perhatikan bahawa ketika tugas yang lama dijalankan, benang kumpulan utas mungkin tersekat untuk waktu yang lama. Untuk memburukkan lagi keadaan, permintaan masuk yang bergantung pada utas dari kumpulan utas mungkin ditangguhkan atau bahkan ditolak terutamanya kerana kumpulan utas mungkin tidak mempunyai utas yang tersedia untuk menangani permintaan masuk. Kumpulan utas juga bukan pilihan yang baik apabila anda mempunyai benang yang berbeza dalam keutamaannya atau anda mungkin perlu membatalkan benang sebelum waktunya. Penamatan benang pramatang menyiratkan bahawa utas telah dihentikan secara paksa sebelum waktu gilirannya berakhir.

Bagaimana kolam utas berfungsi?

Pada hakikatnya, semasa bekerja dengan kumpulan benang, biasanya anda akan membuat koleksi utas dan menyimpannya dalam kumpulan utas sebelum menggunakan utas dalam aplikasi anda. Seperti dan ketika anda memerlukan utas, anda akan menggunakan semula utas tersebut daripada membuat utas baru setiap kali aplikasi perlu menggunakan utas.

Oleh itu, aplikasi akan membuat permintaan ke kumpulan utas untuk mendapatkan utas daripadanya, melakukan aktiviti menggunakan utas dan kemudian mengembalikan benang kembali ke kumpulan utas setelah selesai. Thread kumpulan sangat berguna dalam situasi di mana anda mempunyai lebih banyak tugas yang harus anda laksanakan daripada membuat benang (ada had jumlah maksimum utas yang dapat anda buat setiap proses) dalam aplikasi anda.

Bagaimana saya boleh mengoptimumkan kumpulan utas?

Apabila proses dimulakan, ia diperuntukkan kumpulan utas oleh CLR. Perhatikan bahawa anda boleh mengkonfigurasi ukuran kumpulan utas jika perlu. Waktu berjalan menguruskan kumpulan utas dengan bijak. Apabila kumpulan utas dimulakan, hanya ada satu utas di kumpulan utas. Mulai saat itu, pengurus kumpulan utas (komponen yang bertanggungjawab untuk menguruskan kumpulan utas) membuat lebih banyak utas dan menyimpannya di kumpulan utas ketika beban pada aplikasi meningkat, iaitu, aplikasi memerlukan lebih banyak tugas untuk dilaksanakan secara serentak.

Bilangan utas yang boleh didapati di kumpulan utas pada waktu tertentu ditentukan oleh had maksimum benang yang dibenarkan di kumpulan utas. Dengan kata lain, jumlah utas yang tersedia di kumpulan utas berbeza dari semasa ke semasa bergantung pada penggunaan utas oleh aplikasi. Sebaik sahaja had maksimum (bilangan utas maksimum dalam kumpulan utas) tercapai, aplikasi membuat utas baru lebih jarang.

Anda boleh menetapkan sendiri had atas benang yang dibenarkan di kumpulan utas jika perlu. Untuk melakukan ini, anda harus memanfaatkan harta ThreadPool.SetMaxThreads. Untuk menetapkan had bawah benang di kumpulan utas, anda boleh menggunakan harta ThreadPool.SetMinThreads. Had bawah lalai bilangan utas dalam kumpulan utas adalah satu utas bagi setiap pemproses.