c# – 取消任务

我尝试在取消下面的任务时运行一个简单的例子
CancellationTokenSource tokenSource2 = new CancellationTokenSource();

CancellationToken token2 = tokenSource2.Token;


Task task2 = new Task(() =>
{
    for (int i = 0; i < int.MaxValue; i++)
    {
        token2.ThrowIfCancellationRequested();
        Thread.Sleep(100);
        Console.WriteLine("Task 2 - Int value {0}",i);
    }
},token2);

task2.Start();

Console.WriteLine("Press any key to cancel the task");
Console.ReadLine();

tokenSource2.Cancel();
Console.WriteLine("Task 2 cancelled? {0}",task2.IsCanceled);

我期望Console.WriteLine(“任务2取消?{0}”,task2.IsCanceled);将打印**“任务2取消?真”**,但它打印“假”.

你知道发生了什么吗?这是预期的行为吗?谢谢.

编辑:确保在调用取消请求之前未完成任务.我添加了Console.ReadLine().

解决方法

首先,也许你误解了IsCanceled的意思?这并不意味着“此任务正在等待取消,因此它应该很快完成”,这意味着“此任务已被取消,现在已完成”.

如果你没有误解,请考虑事件的顺序是什么.这是怎么回事:

>调用ThrowIfCancellationRequested(),但令牌尚未取消,因此它不会抛出.
>调用Thread.Sleep(),因此运行Task的线程会休眠.
>调用Cancel().
>检查IsCanceled.任务中的代码没有机会意识到令牌已被取消,因此它仍在运行,因此IsCanceled返回false.
>再次调用ThrowIfCancellationRequested(),这次抛出,实际上取消了Task.

这就是为什么ISCanceled会向您返回false.如果你想让它返回true,你可以在检查IsCanceled之前添加类似Thread.Sleep(150)的东西,或者更好的是,实际上等待Task完成.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...