C# 取消任务
如果等待时间结束,我有一个任务需要取消。比如说C# 取消任务,c#,c#-4.0,task,task-parallel-library,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(s
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
,然后需要取消任务的任何代码都将在需要时调用CancellationTokenSource
。任务将在下次检查取消时抛出,一切都会好起来
这听起来像是在寻找一个非合作的取消,这将是危险的,原因与正常的线程.Abort
是危险的完全相同。让任务选择允许自己取消的点更为简洁