Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mengganggu Tugas Lama dengan Selamat dalam .NET Tanpa Menggunakan Thread.Abort()?

Bagaimana untuk Mengganggu Tugas Lama dengan Selamat dalam .NET Tanpa Menggunakan Thread.Abort()?

Patricia Arquette
Lepaskan: 2025-01-20 01:07:09
asal
954 orang telah melayarinya

How to Safely Interrupt Long-Running Tasks in .NET Without Using Thread.Abort()?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan