从任务正文内部取消任务

ykh*_*ykh 2 .net c# winforms task-parallel-library cancellation

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

例如,在这个伪代码中:

Task tasks = new Task(() =>
{ 
     bool exists = CheckFromDB();
      if (!exists)
         break;
}
Run Code Online (Sandbox Code Playgroud)

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

Yur*_*rii 9

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

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

Task innerCancel = new Task(
    () =>
    {
        if (!CheckFromDB())
        {
            cts.Cancel();
        }
        token.ThrowIfCancellationRequested();
    },
    token);
Run Code Online (Sandbox Code Playgroud)

当你使用return任务时实际上不会被取消,而是在return语句不会被执行后代码,而任务本身将其状态为RanToCompletion.


另外,建议使用Task.Factory.StartNew.NET 4和Task.Run.NET 4.5而不是构造函数来创建任务.