首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任务取消并继续执行

任务取消并继续执行
EN

Stack Overflow用户
提问于 2016-11-28 14:35:36
回答 2查看 1.7K关注 0票数 0

我对取消几个任务感到困惑,并继续执行一个任务来显示结果。根据我的理解,这个程序应该显示

任务取消

代码语言:javascript
复制
CancellationTokenSource cts = new CancellationTokenSource();
List<Task> tasks = new List<Task>();
for(int i= 0; i<3; i++)
{
    tasks.Add(Task.Run(() =>{
        while(!cts.Token.IsCancellationRequested)
            Thread.Sleep(500);
    
        // Uncomment this to see 'Tasks canceled' in the result
        //if(cts.Token.IsCancellationRequested)
        //    cts.Token.ThrowIfCancellationRequested();
    },cts.Token));
}

Task.WhenAll(tasks).ContinueWith(task =>
{
    if(task.IsCanceled)
        Console.WriteLine("Tasks canceled");
    if(task.IsCompleted)
        Console.WriteLine("Tasks completed");
});
Thread.Sleep(2000);
cts.Cancel();

不幸的是它显示了

已完成任务

如果我取消了抛出的取消异常,程序显示

任务取消 已完成任务

为什么?我好像错过了什么但我没看到什么..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-28 14:40:18

在第一种情况下,这就是您的代码所要做的--在请求取消时停止循环。在退出循环之后,没有什么可执行的了,因此任务就完成了。

通过设计真正取消任务,您需要抛出异常以更改执行流程。实际上,代码示例中不需要if语句-- ThrowIfCancellationRequested方法将自行处理此检查,并在请求取消时抛出异常。

关于最后一部分,以下是MSDN的摘录:

当任务处于三种状态之一时,IsCompleted将返回true : RanToCompletion、故障或取消。

https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.iscompleted(v=vs.110).aspx

因此,即使任务被取消,任务也是完成的。

票数 1
EN

Stack Overflow用户

发布于 2016-11-28 14:40:54

基于医生

代码语言:javascript
复制
Task.WhenAll

创建一个任务,当数组中的所有task对象都完成时,该任务将完成。

因此,在所有3项任务结束后,任务将保证处于完全状态。

你想要的可能是

代码语言:javascript
复制
Task.WhenAll(tasks).Wait();
Foreach(Task task in tasks)
{
    if(task.IsCanceled)
        Console.WriteLine("Tasks canceled");
    if(task.IsCompleted)
        Console.WriteLine("Tasks completed");
}

编辑:任务没有被取消的原因是因为你从不抛出这个异常。让我们想象一下这种情况:在调用cts.Cancel();之后,您的任务几乎就完成了。因此,您的任务中没有任何内容被取消,因此它没有标记为已取消。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40846809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档