Membatalkan tugas TPL dengan anggun
Dalam pengaturcaraan berasaskan benang, tugasan mungkin perlu dibatalkan jika persekitaran berubah atau urutan perlu ditamatkan lebih awal. Walau bagaimanapun, apabila utas ditamatkan menggunakan kaedah Batalkan, contoh System.Threading.Task tidak akan dibatalkan secara automatik. Artikel ini meneroka sebab tidak mungkin untuk menghantar terus isyarat Batalkan kepada tugas dan menyediakan penyelesaian alternatif menggunakan token pembatalan.
Menggunakan kaedah Batalkan untuk membatalkan tugas adalah tidak disyorkan kerana ia boleh menyebabkan tingkah laku yang tidak dijangka dan potensi kerosakan data. Pendekatan yang disyorkan ialah menggunakan token pembatalan.
Yang berikut menunjukkan pelaksanaan token pembatalan:
<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.ReadKey(); } }</code>
Dalam contoh ini:
Contoh yang disemak ini memudahkan kod sambil mengekalkan fungsi teras dan kejelasan Gelung while
kini menyemak terus ct.IsCancellationRequested
, menjadikan logik pembatalan lebih ringkas dan bukannya Console.ReadKey()
untuk pengguna yang lebih bersih pengalaman.Console.ReadLine()
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membatalkan Tugas TPL Dengan Anggun Daripada Menggunakan Kaedah Batalkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!