Cara bekerja dengan benang di C #

Benang adalah unit pelaksanaan terkecil dalam proses. Multithreading adalah keupayaan untuk mempunyai beberapa utas dalam memori pada waktu tertentu dan beralih di antara mereka untuk mengendalikan beberapa operasi pada masa yang sama. Microsoft .Net Framework memberikan sokongan yang sangat baik untuk bekerja dengan utas.

Urutan program dalam C #

Untuk bekerja dengan utas, anda harus memasukkan Sistem nama. Threading namespace dalam aplikasi anda. Untuk membuat utas baru, anda harus memanfaatkan perwakilan ThreadStart dan memberikan rujukan ke kaedah yang harus dijalankan pada utas. Perhatikan bahawa perwakilan adalah penunjuk fungsi selamat-jenis. Coretan kod berikut menunjukkan bagaimana anda boleh membuat objek utas baru menggunakan delegasi ini.

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

Untuk memulakan utas yang baru dibuat, anda harus memanggil kaedah Mula pada objek utas yang telah anda buat. Penyenaraian kod berikut menggambarkan ini. Perhatikan bahawa kaedah utas MyThreadMethod dijalankan pada utas baru (disebut thread pekerja) yang telah dibuat.

 kekosongan statik Utama ()

        {

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

            t. Mulakan ();           

            Konsol. Baca ();

        }

        kekosongan statik MyThreadMethod ()

        {

            Console.WriteLine ("Hello World!");

        }

Paparkan keadaan utas dalam C #

Benang dalam memori boleh berada dalam keadaan yang berlainan — Aborsi, Latar Belakang, Berlari, Berhenti, Ditangguhkan, Tidak Dimulai, dan lain-lain. Keadaan benang ditentukan dalam penghitungan ThreadState yang terdapat di Sistem. Ruang nama Threading. Kecuali kaedah Mula dipanggil pada utas, utas tersebut berada dalam keadaan Tidak Bermula. Apabila kaedah Mula dipanggil pada contoh utas, keadaan utas berubah dari Tidak Bermula ke Menjalankan.

Coretan kod berikut menunjukkan bagaimana anda dapat memaparkan keadaan utas di konsol.

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

t. Mulakan ();

Console.WriteLine ("Keadaan benang adalah:" + t.ThreadState.ToString ());

Kawal urutan latar depan dan latar di C #

Benang boleh berjalan sama ada di latar depan atau latar belakang. Benang yang anda buat secara eksplisit adalah utas latar depan. Salah satu perbezaan utama antara utas latar depan dan utas latar belakang ialah aplikasi anda hanya tinggal selagi satu atau lebih utas latar depan berjalan. Pada hakikatnya, utas latar depan menghalang aplikasi daripada ditamatkan. Sebaliknya, utas latar tidak menjadikan persekitaran Runtime Bahasa Umum tetap hidup.

Anda boleh menetapkan status latar belakang utas menggunakan harta tanah IsBackground. Berikut adalah contoh kod yang menunjukkan bagaimana ini dapat dicapai.

 kekosongan statik Utama ()

        {

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

            t. Mulakan ();

            t.IsBackground = benar;

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

            Konsol. Baca ();

        }

Anda boleh menangguhkan atau menyambung semula utas dengan menggunakan kaedah Suspend () dan Resume () pada objek utas. Perhatikan bahawa anda hanya dapat menyambung semula utas yang sebelumnya anda tangguhkan dengan membuat panggilan ke kaedah Tangguhkan ().

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

t. Mulakan ();

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

t.Rumusan (); // Menyambung semula benang yang digantung

Walau bagaimanapun, perlu diperhatikan bahawa kaedah Thread.Suspend () dan Thread.Resume () telah tidak digunakan lagi. Sebaliknya anda harus menggunakan kaedah AutoResetEvent dan EventWaitHandle untuk menyegerakkan aktiviti yang melibatkan utas.

Tetapkan keutamaan utas dalam C #

Anda boleh mengawal keutamaan utas untuk menentukan bahagian relatif masa pemproses yang akan diperolehi benang berbanding dengan utas lain yang berada dalam memori. Keutamaan benang ditentukan dalam penghitungan ThreadPriority. Nilai yang mungkin termasuk: Rendah, BawahNormal, Biasa, AtasNormal, dan Tertinggi. Coretan kod berikut menggambarkan bagaimana anda dapat menetapkan keutamaan utas dua utas menggunakan sifat Prioriti objek utas.

 kekosongan statik Utama ()

        {

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

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

            utas1.Priority = ThreadPriority.Tinggi;

            utas2.Priority = ThreadPriority.Lowest;

            utas2.Mulakan ();

            utas1. Mulakan ();

            Konsol. Baca ();

        }

        Kaedah tidak sah statik1 ()

        {

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

            {

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

            }

        }

        Kaedah tidak sah statik2 ()

        {

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

            {

                Console.WriteLine ("Thread kedua:" + i);

            }

        }

Apabila anda menjalankan coretan kod di atas, anda akan melihat bahawa utas pertama menyelesaikan pelaksanaannya menjelang utas kedua walaupun utas kedua dimulakan sebelum utas pertama dalam kaedah Utama.

Benang mahal. Mereka menggunakan banyak sumber dalam sistem anda untuk inisialisasi, beralih konteks, dan melepaskan sumber yang mereka gunakan. Oleh itu, multithreading harus digunakan secara bijaksana dan hanya apabila diperlukan. Apabila anda memanfaatkan multithreading, selalu dianjurkan untuk memanfaatkan kumpulan benang untuk membuat dan menguruskan utas berdasarkan permintaan dan meningkatkan respons aplikasi anda.