1. 使用CancellationTokenSource退出Thread
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace TokenSourceTest { public partial class Form1 : Form { private CancellationTokenSource cts = null; private int i = 1; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { cts = new CancellationTokenSource(); this.listBox1.Items.Clear(); Thread thread = new Thread(new ThreadStart(ThreadTest)); thread.IsBackground = true; thread.Start(); this.button1.Enabled = false; } private void button3_Click(object sender, EventArgs e) { cts.Cancel(); this.labelThread.Text="线程一已取消"; this.button1.Enabled = true; } public void ThreadTest() { while (!cts.IsCancellationRequested) { this.listBox1.Invoke((MethodInvoker)delegate () { this.listBox1.Items.Add(i++); }); Thread.Sleep(200); } } } }
2. 使用CancellationTokenSource退出Task
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace TokenSourceTest { public partial class Form1 : Form { private CancellationTokenSource cts = null; private int i = 1; public Form1() { InitializeComponent(); } private void button4_Click(object sender, EventArgs e) { cts = new CancellationTokenSource(); Task task = new Task(() => { //获取是否已请求取消此线程 while (!cts.IsCancellationRequested) { //Invoke在拥有此控件的基础窗口句柄的线程上执行指定的委托 this.listBox1.Invoke((MethodInvoker)delegate () { this.listBox1.Items.Add(i++); }); Thread.Sleep(200); } }); task.Start(); this.button4.Enabled = false; } private void button2_Click(object sender, EventArgs e) { cts.Cancel(); this.labelThread.Text = "线程二取消"; this.button4.Enabled = true; } } }