如果等待时间结束,我需要取消一项任务。例如
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();
}
控制台显示“仍在工作”。我以为任务会被取消。
我确信我错过了一些东西。我错过了什么?感谢。
答案 0 :(得分:29)
取消令牌不会神奇地取消任何东西。他们只是允许您以标准化的方式检查取消,例如通过ThrowIfCancellationRequested
。
所以通常你需要做一些需要完成大量工作的任务。它会定期调用ThrowIfCancellationRequested
,然后需要取消任务的任何代码都会在需要时在CancellationTokenSource
上调用Cancel
。该任务将在下次检查取消时抛出,一切都会好的。
听起来你正在寻找一个非合作的取消 - 这将是危险的,原因与正常Thread.Abort
危险的原因完全相同。让任务选择允许自己取消的点是更清洁的。