您的位置:首页 > 编程语言 > C#

C# CancellationTokenSource 终止线程 CancellationTokenSource实现对超时任务的取消

2015-06-27 19:00 791 查看

C# 使用 CancellationTokenSource 终止线程

使用CancellationTokenSource对象需要与Task对象进行配合使用,Task会对当前运行的状态进行控制(这个不用我们关心是如何孔控制的)。而CancellationTokenSource则是外部对Task的控制,如取消、定时取消。

下面我们来看看示例代码

class Program

{

//声明CancellationTokenSource对象

static CancellationTokenSource cancelTokenSource = new CancellationTokenSource();

//程序入口

static void Main(string[] args)

{

Task.Factory.StartNew(MyTask, cancelTokenSource.Token);

Console.WriteLine("请按回车键(Enter)停止");

Console.ReadLine();

cancelTokenSource.Cancel();//通知取消任务或者终止线程

Console.WriteLine("已停止");

Console.ReadLine();

}

//测试方法

static void MyTask()

{

//判断是否取消任务

while (!cancelTokenSource.IsCancellationRequested)

{

Console.WriteLine(DateTime.Now);

Thread.Sleep(1000);

}

}

}

.Net 4.5中通过CancellationTokenSource实现对超时任务的取消

在基于Task的任务执行过程中,我们通常使用CancellationTokenSource来实现任务取消,首先看一个简单的例子。

();

.Factory.StartNew(() =>
{
(!cancelTokenSource.IsCancellationRequested)
{
.Now);
.Sleep(1000);
}
}, cancelTokenSource.Token);

);
.ReadLine();
cancelTokenSource.Cancel();
);
.ReadLine();

很多时候,除了像上例中的那样手动取消外,我们往往也要对任务设置一个预期执行时间,对超时的任务自动取消。之前一般做法是新启动一个计时器,在计时器的超时回调中执行CancellationTokenSource.Cancel方法。在.Net 4.5中,该操作得到了进一步的简化,我们可以通过在创建CancellationTokenSource时设置超时来实现这一功能。

var cancelTokenSource = new CancellationTokenSource(3000);

除此之外,也可以通过如下代码实现同样的效果。

cancelTokenSource.CancelAfter(3000);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: