CancellationTokenSource向应该被取消的 System.Threading.CancellationToken 发送信号,听起来不好理解,简单理解就是可以取消线程,上代码
//定义一个取消线程的变量
CancellationTokenSource cancellationTokenSource;
private void simpleButton1_Click(object sender, EventArgs e)
{
cancellationTokenSource = new CancellationTokenSource();
Task task = Task.Run(()=>
{
Thread.Sleep(5000);
Console.WriteLine(Thread.CurrentThread.GetHashCode());
try
{
cancellationTokenSource.Token.ThrowIfCancellationRequested();
MessageBox.Show("该线程还活着");
}
catch (Exception ex)
{
MessageBox.Show("该线程已取消");
}
Console.WriteLine(Thread.CurrentThread.GetHashCode());
});
}
private void simpleButton2_Click(object sender, EventArgs e)
{
if (cancellationTokenSource == null) return;
cancellationTokenSource.Cancel();
}
操作步骤:点击开始线程然后立刻点击取消线程按钮。
点击开始线程按钮的时候,创建一个线程,首先让线程沉睡5秒,便于可以点击取消线程按钮, cancellationTokenSource.Token.ThrowIfCancellationRequested() 这个方法中如果取消了线程这个方法会引发System.OperationCanceledException异常,结果如下:
然后看一下控制台发现后面的那一句记录线程的hashcode的值依旧被输出了出来
调用Cancel()方法的时候线程没有被取消么?看了资料后了解到调用Cancel()方法后只是会做一个标记,会把此线程IsCancellationRequested状态设置成true,线程是不会真的被结束的,只能通过逻辑处理,抛出异常来打断线程。
if (cancellationTokenSource.IsCancellationRequested)
{
MessageBox.Show("该线程已取消");
throw new OperationCanceledException();
}
else
{
MessageBox.Show("该线程还活着");
}
异常抛出后结果