取消任务

时间:2011-03-02 19:21:28

标签: c# c#-4.0 task task-parallel-library

如果等待时间结束,我需要取消一项任务。例如

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 个答案:

答案 0 :(得分:29)

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

所以通常你需要做一些需要完成大量工作的任务。它会定期调用ThrowIfCancellationRequested,然后需要取消任务的任何代码都会在需要时在CancellationTokenSource上调用Cancel。该任务将在下次检查取消时抛出,一切都会好的。

听起来你正在寻找一个非合作的取消 - 这将是危险的,原因与正常Thread.Abort危险的原因完全相同。让任务选择允许自己取消的点是更清洁的。