取消任务

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

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(); } 

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

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

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

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

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