Menghentikan Tugas .NET Dengan Selamat: Alternatif kepada Thread.Abort()
Tidak seperti utas, yang boleh dihentikan secara paksa dengan Thread.Abort()
, tugasan dalam .NET 4.0 dan kemudiannya tidak mempunyai persamaan langsung untuk penamatan serta-merta. Walaupun token pembatalan menawarkan strategi keluar yang anggun, sesetengah situasi memerlukan gangguan tugas segera.
Senario Menuntut Penamatan Tugasan Segera
Pertimbangkan aplikasi Windows Forms melakukan menyekat panggilan perkhidmatan web segerak dalam gelung selari:
<code class="language-csharp">CancellationTokenSource cts = new CancellationTokenSource(); ParallelOptions po = new ParallelOptions(); po.CancellationToken = cts.Token; po.MaxDegreeOfParallelism = System.Environment.ProcessorCount; Parallel.ForEach(iListOfItems, po, (item, loopState) => { Thread.Sleep(120000); // Simulates a web service call });</code>
Jika pengguna menutup aplikasi pada pertengahan proses, urutan gelung selari terus berjalan, yang berpotensi menyebabkan kelewatan dan aplikasi terhenti.
Melebihi Token Pembatalan
Token pembatalan sesuai untuk penamatan yang anggun, tetapi ia kurang berkesan dengan menyekat panggilan. Penyelesaian yang lebih mantap melibatkan bendera Boolean, stopExecuting
, ditandakan dalam gelung tugas untuk memberi isyarat berhenti serta-merta:
<code class="language-csharp">bool stopExecuting; Parallel.ForEach(iListOfItems, po, (item, loopState) => { if (stopExecuting) { loopState.Stop(); return; } // Task execution code });</code>
Menetapkan stopExecuting
kepada true
apabila pengguna menutup borang menghentikan semua tugas yang sedang dijalankan. Walau bagaimanapun, ini tidak menghapuskan kelewatan daripada panggilan menyekat yang sudah berjalan.
Thread.Abort()
– Permulaan Terakhir
Thread.Abort()
boleh digunakan pada benang yang dihasilkan oleh gelung selari sebagai pilihan terakhir, tetapi ini amat tidak digalakkan kerana kemungkinan ketidakstabilan sistem.
Menggunakan bendera kongsi selamat benang dan mengelakkan token pembatalan untuk penamatan serta-merta menyediakan pendekatan yang lebih selamat dan terurus untuk senario yang memerlukan gangguan tugasan pantas.
Atas ialah kandungan terperinci Bagaimana untuk Mengganggu Tugas Lama dengan Selamat dalam .NET Tanpa Menggunakan Thread.Abort()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!