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,然后任何需要取消任务的代码将Cancel在CancellationTokenSource需要时调用.当下次检查取消时,任务将抛出,一切都会好的.
听起来你正在寻找一个非合作的取消 - 这将是危险的,正如同样的原因,正常Thread.Abort是危险的.让任务选择允许自己被取消的点是更清洁的.