Cara bekerja dengan utas di C #

Utas adalah unit eksekusi terkecil dalam suatu proses. Multithreading adalah kemampuan untuk memiliki banyak utas dalam memori pada waktu tertentu dan beralih di antaranya untuk menangani beberapa operasi pada waktu yang sama. Microsoft .Net Framework menyediakan dukungan luar biasa untuk bekerja dengan utas.

Utas pemrograman di C #

Untuk bekerja dengan thread, Anda harus menyertakan namespace System.Threading dalam aplikasi Anda. Untuk membuat utas baru, Anda harus memanfaatkan delegasi ThreadStart dan meneruskan referensi ke metode yang harus dijalankan pada utas. Perhatikan bahwa delegasi adalah penunjuk fungsi tipe-aman. Cuplikan kode berikut menunjukkan bagaimana Anda dapat membuat objek thread baru menggunakan delegasi ini.

 Thread t = Thread baru (ThreadStart baru (MyThreadMethod)); 

Untuk memulai thread yang baru dibuat, Anda harus memanggil metode Start pada objek thread yang telah Anda buat. Daftar kode berikut menggambarkan hal ini. Perhatikan bahwa metode utas MyThreadMethod dijalankan pada utas baru (disebut utas pekerja) yang telah dibuat.

 kekosongan statis Utama ()

        {

            Thread t = Thread baru (ThreadStart baru (MyThreadMethod));

            t. Mulai ();           

            Console.Read ();

        }

        void statis MyThreadMethod ()

        {

            Console.WriteLine (“Hello World!”);

        }

Tampilkan status utas di C #

Sebuah utas dalam memori dapat berada dalam status berbeda — Dibatalkan, Latar Belakang, Berjalan, Dihentikan, Ditangguhkan, Tidak Dimulai, dll. Status utas ditentukan dalam enumerasi ThreadState yang tersedia di namespace System.Threading. Kecuali jika metode Mulai dipanggil pada utas, utas berada dalam status Tidak Dimulai. Ketika metode Start dipanggil pada instance thread, status thread berubah dari Tidak Dimulai menjadi Berjalan.

Cuplikan kode berikut menunjukkan bagaimana Anda dapat menampilkan status thread di konsol.

 Thread t = Thread baru (ThreadStart baru (MyThreadMethod));

t. Mulai ();

Console.WriteLine (“Status utas adalah:“ + t.ThreadState.ToString ());

Kontrol latar depan dan latar belakang utas di C #

Untaian dapat berjalan di latar depan atau di latar belakang. Utas yang Anda buat secara eksplisit adalah utas latar depan. Salah satu perbedaan utama antara utas latar depan dan utas latar belakang adalah bahwa aplikasi Anda hanya hidup selama satu atau beberapa utas latar depan sedang berjalan. Intinya, utas latar depan mencegah aplikasi dihentikan. Sebaliknya, thread latar belakang tidak membuat lingkungan Common Language Runtime tetap hidup.

Anda dapat menyetel status latar belakang utas menggunakan properti IsBackground. Berikut adalah contoh kode yang menunjukkan bagaimana hal ini dapat dicapai.

 kekosongan statis Utama ()

        {

            Thread t = Thread baru (ThreadStart baru (MyThreadMethod));

            t. Mulai ();

            t.IsBackground = true;

            Console.WriteLine (“Status latar belakang utas adalah:“ + t.IsBackground.ToString ());

            Console.Read ();

        }

Anda bisa menangguhkan atau melanjutkan utas dengan menjalankan metode Suspend () dan Resume () pada objek utas. Perhatikan bahwa Anda hanya bisa melanjutkan utas yang sebelumnya Anda tangguhkan dengan melakukan panggilan ke metode Suspend ().

 Thread t = Thread baru (ThreadStart baru (MyThreadMethod));

t. Mulai ();

t.Suspend (); // Menangguhkan utas yang baru dibuat

t.Resume (); // Melanjutkan utas yang ditangguhkan

Namun, perlu diperhatikan bahwa metode Thread.Suspend () dan Thread.Resume () sudah tidak digunakan lagi. Sebaliknya Anda harus menggunakan metode AutoResetEvent dan EventWaitHandle untuk menyinkronkan aktivitas yang melibatkan utas.

Atur prioritas utas di C #

Anda dapat mengontrol prioritas utas untuk menentukan bagian relatif waktu prosesor yang akan dibandingkan dengan utas lain yang berada di memori. Prioritas utas ditentukan dalam pencacahan ThreadPriority. Nilai yang mungkin termasuk: Terendah, Di BawahNormal, Normal, Di AtasNormal, dan Tertinggi. Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat menyetel prioritas utas dari dua utas menggunakan properti Prioritas dari objek utas.

 kekosongan statis Utama ()

        {

            Thread thread1 = Thread baru (ThreadStart baru (Method1));

            Thread thread2 = Thread baru (ThreadStart baru (Method2));

            thread1.Priority = ThreadPriority.Highest;

            thread2.Priority = ThreadPriority.Lowest;

            thread2.Start ();

            thread1.Start ();

            Console.Read ();

        }

        kekosongan statis Method1 ()

        {

            untuk (int i = 0; i <10; i ++)

            {

                Console.WriteLine (“Utas pertama:“ + i);

            }

        }

        Void statis Metode2 ()

        {

            untuk (int i = 0; i <10; i ++)

            {

                Console.WriteLine (“Utas kedua:“ + i);

            }

        }

Saat Anda menjalankan cuplikan kode di atas, Anda akan melihat bahwa utas pertama menyelesaikan eksekusinya sebelum utas kedua meskipun utas kedua dimulai sebelum utas pertama dalam metode Utama.

Benang itu mahal. Mereka mengkonsumsi banyak sumber daya di sistem Anda untuk inisialisasi, mengganti konteks, dan melepaskan sumber daya yang mereka konsumsi. Akibatnya multithreading harus digunakan dengan bijaksana dan hanya jika diperlukan. Saat Anda memanfaatkan multithreading, selalu disarankan untuk memanfaatkan kumpulan utas untuk membuat dan mengelola utas sesuai permintaan dan meningkatkan daya tanggap aplikasi Anda.