从任务正文内部取消任务

时间:2014-08-16 10:59:44

标签: c# .net winforms task-parallel-library cancellation

我读到了取消方法,但根据我的理解,它们都提供了对任务外部任务的控制,但是如果我想从内部取消任务。

例如在这个伪代码中:

Task tasks = new Task(() =>
{ 
     bool exists = CheckFromDB();
      if (!exists)
         break;
}

我可以从内部取消任务吗? 我得到的唯一想法是在任务中触发一个异常,并从外部处理它,但这不是一种方法。

2 个答案:

答案 0 :(得分:9)

如果您想真正取消任务(例如,在完成后Status属性设置为Canceled),您可以这样做:

var cts = new CancellationTokenSource();
var token = cts.Token;

Task innerCancel = new Task(
    () =>
    {
        if (!CheckFromDB())
        {
            cts.Cancel();
        }
        token.ThrowIfCancellationRequested();
    },
    token);

使用return时,任务实际上不会被取消,而是在return语句不会被执行后代码,而任务本身将拥有它陈述为RanToCompletion


另一方面,advised使用Task.Factory.StartNew表示.NET 4,Task.Run表示.NET 4.5而不是构造函数来创建任务。

答案 1 :(得分:3)

任务中的lambda表达式代码与任何其他方法的行为方式相同。如果由于某种原因想要结束任务,您只需返回:

Task task = Task.Run(() =>
{ 
    if(!CheckFromDB())
    {
        return;
    }
}

您也可以抛出异常。这将结束任务并将其标记为出现故障,但如果可以避免,则没有理由这样做。如果你真的回答了一些你无法克服的问题,那么是的,只是抛出异常。