Bolehkah tugasan .NET ditamatkan secara tiba-tiba seperti benang?
Dalam .NET, urutan boleh ditamatkan menggunakan kaedah Abort()
. Tindakan ini boleh menyebabkan sebarang operasi yang sedang berjalan terganggu secara tiba-tiba, menyebabkan masalah yang mungkin berlaku. Walau bagaimanapun, bolehkah penamatan mendadak ini digunakan pada tugasan dalam .NET 4.0?
Jawapannya terletak pada memahami perbezaan antara tugas dan utas. Benang menyediakan mekanisme penyegerakan langsung, manakala tugas ialah blok kod yang dilaksanakan secara tidak segerak pada kumpulan benang. Tugasan tidak mempunyai kawalan langsung ke atas benang dan oleh itu tidak sesuai untuk kaedah khusus benang seperti Abort()
.
.NET menyediakan mekanisme CancellationToken
untuk menamatkan tugas dengan anggun. Dengan menetapkan CancellationTokenSource
kepada keadaan Cancel
, anda boleh meminta agar tugas berhenti dilaksanakan. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa pembatalan tidak menamatkan tugas dengan serta-merta, sebaliknya, ia menandakan tugas untuk keluar dari skop semasa atau menunggu.
Dalam situasi di mana penamatan segera adalah kritikal, walaupun dengan mengorbankan kehilangan data, panduan penggunaan Thread.Abort()
kekal kontroversial. Walaupun penggunaannya secara amnya tidak disyorkan kerana potensi akibat yang tidak dijangka, ia mungkin wajar dalam keadaan khusus.
Pertimbangkan situasi di mana aplikasi Windows Forms bersambung ke perkhidmatan web segerak yang menyekat, melaksanakan fungsi dalam gelung selari. Katakan panggilan menyekat mengambil masa yang banyak, katakan beberapa minit. Jika pengguna menutup aplikasi dalam masa yang sama, 20 utas yang dibuat akan terus memproses 1000 item dalam gelung.
Oleh kerana urutan dibuat dengan keutamaan latar depan, ia memastikan domain aplikasi tetap hidup walaupun selepas borang ditutup. Tanpa mekanisme keluar yang anggun, aplikasi mungkin tidak ditamatkan seperti yang dijangkakan walaupun kaedah Cancel
dipanggil.
Untuk menyelesaikan masalah ini, bendera selamat benang (stopExecuting
) boleh diperkenalkan dalam gelung. Dengan menyemak bendera ini, urutan boleh keluar dengan anggun apabila ia ditetapkan kepada true
. Ini membolehkan aplikasi ditamatkan semasa menyekat panggilan masih dijalankan.
Walau bagaimanapun, perlu diingat bahawa domain aplikasi akan kekal aktif sehingga semua urutan latar depan menyelesaikan tugas mereka. Hanya utas sebenar Abort
boleh mengganggu panggilan menyekat, dan ini harus dikendalikan dengan berhati-hati dalam pengendali pengecualian utas.
Atas ialah kandungan terperinci Bolehkah Tugasan .NET Ditamatkan Secara Tiba-tiba Seperti Benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!