我读到了取消方法,但根据我的理解,它们都提供了对任务外部任务的控制,但是如果我想从内部取消任务。
例如在这个伪代码中:
Task tasks = new Task(() =>
{
bool exists = CheckFromDB();
if (!exists)
break;
}
我可以从内部取消任务吗? 我得到的唯一想法是在任务中触发一个异常,并从外部处理它,但这不是一种方法。
答案 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;
}
}
您也可以抛出异常。这将结束任务并将其标记为出现故障,但如果可以避免,则没有理由这样做。如果你真的回答了一些你无法克服的问题,那么是的,只是抛出异常。