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()
以获得类似效果。