Dua sen saya pada metode Thread.Abort dan Thread.Interrupt

Di C #, Anda mungkin sering perlu melepaskan utas yang telah diblokir. Untuk mencapai ini, ada dua metode yang dapat Anda manfaatkan. Ini termasuk metode Thread.Abort dan Thread.Interrupt.

Apa yang dilakukan metode Thread.Abort?

Untuk mengakhiri utas, Anda dapat memanfaatkan metode Batalkan kelas Thread. Perhatikan bahwa untuk memulai proses penghentian utas, metode Abort dari kelas Thread saat dipanggil, memunculkan ThreadAbortException di utas yang telah dipanggil. Perlu dicatat bahwa Anda dapat memanfaatkan metode Abort dari kelas Thread untuk menghentikan bahkan thread yang tidak diblokir. Jika utas yang sedang terputus berada dalam status menunggu, itu membangunkannya dan kemudian menyebabkan ThreadInterruptedException dilemparkan. Demikian pula, jika Anda memanggil metode Thread.Abort pada thread yang berada dalam status menunggu, runtime akan mengaktifkan thread tersebut dan kemudian menampilkan ThreadAbortException.

Anda dapat menangkap ThreadAbortException di blok catch. Namun, jika Anda tidak memanggil metode ResetAbort, pengecualian ini akan ditampilkan kembali di akhir blok catch. Panggilan ke metode ResetAbort akan mencegah ThreadAbortException dilempar ulang di akhir blok catch. Berlawanan dengan cara kerja metode Thread.Inturrupt, jika thread tempat metode Thread.Abort dipanggil tidak diblokir, metode Thread.Abort akan menampilkan ThreadAbortException pada thread tersebut.

Dalam kebanyakan kasus (kecuali Anda ingin mematikan domain aplikasi setelah utas dibatalkan), Anda tidak perlu menggunakan metode ini sama sekali. Perhatikan bahwa metode Response.Redirect di ASP.Net melontarkan ThreadAbortException.

Apa tujuan dari metode Thread.Interrupt?

Anda dapat menggunakan metode Thread.Interrupt untuk menghentikan thread yang berada dalam status WaitSleepJoin. Namun, tidak satu pun dari pendekatan ini (panggilan metode Thread.Abort atau Thread.Interrupt) yang aman untuk thread. Saat metode Thread.Abort melontarkan ThreadAbortException, metode Thread.Interrupt akan menampilkan ThreadInterruptException. Pada dasarnya, panggilan ke metode Thread.Interrupt akan menyela thread dan melontarkan ThreadInterruptedException untuk menghentikan thread di dalam panggilan pemblokiran. Anda harus menangani pengecualian ini jika kode gagal, yang waktu prosesnya akan menghentikan utas tempat metode Thread.Interrupt dipanggil. Perlu dicatat bahwa panggilan ke Thread.Interrupt tidak mengganggu thread yang sedang menjalankan kode yang tidak dikelola.

Pertimbangkan daftar kode berikut yang menggambarkan bagaimana metode Thread.Interrupt dapat dipanggil secara paksa untuk menginterupsi sebuah thread.

static void Main(string[] args)

       {

           Thread thread = new Thread(ThreadMethod);

           thread.Start();

           thread.Interrupt();

           Console.Read();

       }

       private static void ThreadMethod()

       {

           try

           {

               Thread.Sleep(Timeout.Infinite);

           }

           catch (ThreadInterruptedException)

           {

             Console.Write("ThreadInterruptedException has been called forcibly.");

           }

       }

Ketika program di atas dijalankan, pesan "ThreadInterruptedException telah dipanggil secara paksa" akan ditampilkan di konsol.

Apa yang terjadi jika utas yang terputus tidak diblokir? Jika Anda melakukan panggilan ke Thread. Terganggu pada thread yang tidak diblokir, thread akan terus dieksekusi hingga saat itu diblokir berikutnya. Dalam kebanyakan kasus, Anda tidak perlu menggunakan Thread.Interrupt sama sekali. Anda dapat mencapai hal yang sama menggunakan konstruksi pensinyalan atau token pembatalan.

Haruskah saya menggunakan metode Thread.Abort atau Thread.Interrupt?

Jadi, kapan saya harus menggunakan metode Thread.Abort vs Thread.Interrupt dalam program saya? Jika saya perlu membatalkan operasi tertentu, metode manakah yang harus saya gunakan? Jawaban jujur ​​saya adalah Anda tidak boleh menggunakan salah satu dari metode ini untuk mengakhiri utas. Dianjurkan untuk tidak menggunakan metode Thread.Abort atau Thread.Interrupt untuk menghentikan sebuah thread - Anda sebaiknya memanfaatkan objek sinkronisasi (seperti, WaitHandles atau Semaphores) dan melakukan penghentian yang anggun terhadap thread yang Anda gunakan. Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat memanfaatkan WaitHandle untuk memungkinkan utas berhenti dengan baik.

private void ThreadMethod()

{

   while(!manualResetEventObject.WaitOne(TimeSpan.FromMilliseconds(100)))

   {

       //Write your code here

   }

}

Sebagai pendekatan alternatif untuk menghentikan utas dengan baik, Anda juga dapat memanfaatkan variabel "boolean" yang mudah menguap. Anda kemudian dapat menyetel variabel ini di thread UI pada beberapa aktivitas pengguna (asumsikan bahwa pengguna telah mengklik tombol "Batal" di UI untuk menghentikan utas) dan kemudian memeriksa nilai variabel dari waktu ke waktu di Worker utas untuk melihat apakah variabel telah disetel (mungkin nilai "salah" untuk menunjukkan penghentian utas) di antarmuka pengguna.