取消任务

sta*_*ser 10 c# task task-parallel-library c#-4.0

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

var t = Task.Factory.StartNew(() => 
{
  Thread.Sleep(5000) // some long running task
  "do something"
});
Task.WaitAll(new[] {t}, 1000);
Run Code Online (Sandbox Code Playgroud)

但似乎任务仍在继续.我尝试使用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();
        }
Run Code Online (Sandbox Code Playgroud)

控制台显示"仍在工作".我以为任务会被取消.

我相信我错过了一些东西.我错过了什么?谢谢.

Jon*_*eet 29

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

所以通常你会有一些需要执行大量工作的任务.它定期调用ThrowIfCancellationRequested,然后任何需要取消任务的代码将CancelCancellationTokenSource需要时调用.当下次检查取消时,任务将抛出,一切都会好的.

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