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;
}
}
}