取消任务

11
我有一个任务,如果等待时间超过了预定时间,就需要取消该任务。例如:
var t = Task.Factory.StartNew(() => 
{
  Thread.Sleep(5000) // some long running task
  "do something"
});
Task.WaitAll(new[] {t}, 1000);

但似乎任务仍在运行。我尝试使用CancellationTokenSource,但似乎也没有起作用。

我使用以下代码片段进行确认:

static void Main(string[] args)
        {
            var cancellationTokenSource = new CancellationTokenSource();

            var t = Task.Factory.StartNew(() => {
                Thread.Sleep(5000);
                Console.WriteLine("Still working");
            }, cancellationTokenSource.Token);

            Task.WaitAll(new[] {t}, 1000);

            cancellationTokenSource.Cancel();

            Console.ReadLine();
        }

控制台显示“仍在工作”。我以为任务已经被取消了。

我确定我漏掉了什么。我错过了什么?谢谢。

1个回答

30

取消令牌并不能神奇地取消任何东西。它们只是允许您以标准化的方式检查取消,例如通过ThrowIfCancellationRequested

因此,通常您会有一些需要执行大量工作的任务。它会定期调用ThrowIfCancellationRequested,当需要取消任务的代码需要时,会在CancellationTokenSource上调用Cancel。任务将在下一次检查取消时抛出异常,这样就可以顺利完成了。

听起来你正在寻找一种非协作式的取消方式,但这样做会很危险,原因与正常的Thread.Abort相同。最好让任务选择允许自己被取消的点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接