Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh membatalkan tugas dengan anggun di kolam benang dan bukannya menggunakan thread.abort ()?

Bagaimanakah saya boleh membatalkan tugas dengan anggun di kolam benang dan bukannya menggunakan thread.abort ()?

Linda Hamilton
Linda Hamiltonasal
2025-01-25 02:25:09277semak imbas

How Can I Gracefully Cancel Tasks in a Thread Pool Instead of Using Thread.Abort()?

Pengendalian elegan pembatalan tugas urutan

Dalam aplikasi berbilang benang, adalah penting untuk mengurus dan menamatkan tugasan dalam rangkaian dengan berkesan. Dalam kes ini, anda menghadapi masalah di mana .Abort() pada thread gagal menamatkan tugasan yang berkaitan. Untuk menyelesaikan masalah ini, mari teroka pendekatan yang disyorkan: menggunakan teg batal.

Memahami kumpulan benang dan gelagat tugas

Apabila System.Threading.Tasks dibuat, tugasan ini bergantung pada urutan latar belakang yang diuruskan oleh kumpulan benang. Menggunakan .Abort() untuk membatalkan urutan ini tidak disyorkan kerana potensi kebocoran sumber dan ketidakstabilan aplikasi.

Gunakan tanda pembatalan untuk pembatalan tugas

Daripada bergantung pada .Abort(), gunakan penandaan pembatalan sebagai kaedah penamatan tugas yang lebih cekap dan terkawal. Begini cara ia berfungsi:

  • Buat CancellationTokenSource dan dedahkan sifat CancellationTokennya.
  • Apabila memulakan tugas, hantarkan PembatalanToken kepada pembinanya atau kaedah StartNew.
  • Dalam logik pelaksanaan tugas, semak secara berkala sama ada bendera CancellationToken.IsCancellationRequested telah ditetapkan.
  • Tamatkan pelaksanaan dengan anggun dan nyatakan (cth., melalui pengelogan) jika permintaan telah dibatalkan.

Contoh pelaksanaan

Contoh kod berikut menunjukkan cara menggunakan teg batal:

<code class="language-csharp">class Program
{
    static void Main()
    {
        var cts = new CancellationTokenSource();
        CancellationToken ct = cts.Token;
        Task.Factory.StartNew(() =>
        {
            while (!ct.IsCancellationRequested)
            {
                // 执行工作
                Thread.Sleep(100);
            }
            // 处理取消
            Console.WriteLine("任务已取消");
        }, ct);

        // 模拟等待任务完成
        Thread.Sleep(3000);

        // 启动任务取消
        cts.Cancel();
        Console.ReadLine();
    }
}</code>

Dalam contoh ini, tugasan akan berjalan selama-lamanya sehingga kaedah CancellationTokenSource.Cancel() dipanggil, mencetuskan logik pembatalan dalam tugasan dan menamatkan pelaksanaannya. Kod yang dipertingkatkan mengelakkan sarang if pernyataan yang tidak perlu, menjadikan kod lebih ringkas dan boleh dibaca.

Atas ialah kandungan terperinci Bagaimanakah saya boleh membatalkan tugas dengan anggun di kolam benang dan bukannya menggunakan thread.abort ()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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