C# 从任务主体内部取消任务

C# 从任务主体内部取消任务,c#,.net,winforms,task-parallel-library,cancellation,C#,.net,Winforms,Task Parallel Library,Cancellation,我读过关于取消方法的文章,但根据我的理解,它们都提供了对任务外部任务的控制,但是如果我想从内部取消任务 例如,在此伪代码中: Task tasks = new Task(() => { bool exists = CheckFromDB(); if (!exists) break; } 我可以从内部取消任务吗? 我唯一的想法是在任务内部触发一个异常并从外部处理它,但这显然不是这样做的。任务内部的lambda表达式代码的行为与任何其他方法中的行为相

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

例如,在此伪代码中:

Task tasks = new Task(() =>
{ 
     bool exists = CheckFromDB();
      if (!exists)
         break;
}
我可以从内部取消任务吗?
我唯一的想法是在任务内部触发一个异常并从外部处理它,但这显然不是这样做的。

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

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

您还可以抛出异常。这将结束任务并将其标记为错误,但如果可以避免,则没有理由这样做。如果您真的对一些无法克服的问题做出响应,那么是的,只需抛出一个异常。

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

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

Task innerCancel = new Task(
    () =>
    {
        if (!CheckFromDB())
        {
            cts.Cancel();
        }
        token.ThrowIfCancellationRequested();
    },
    token);
使用
return
时,不会实际取消任务,而是不会执行
return
语句后的代码,任务本身的状态为
RanToCompletion



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

是否有一个属性可以使用或分配,以便我可以处理返回。@user733659了解特定的返回?不是真的。。。但是,您可以使lambda返回一个值(可能是布尔值)。您还可以引发特定的异常。您可以使用事件或事件。这是一种更好的方法。您应该使用
Task.Run
而不是
newtask
返回热任务,而不是冷任务one@YuvalItzchakov,我同意使用
任务。运行
而不是返回冷任务,但在这种情况下,为了一致性,我决定按照OP编写的方式进行操作。我认为您应该向OP显示正确的路径,而不是坚持不正确的一致性:)注意,如果您不需要在任务之外取消,您也可以删除取消令牌并执行
抛出新操作CanceledException()
代替
cts.Cancel()
以获得类似效果。