Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 取消任务_C#_C# 4.0_Task_Task Parallel Library - Fatal编程技术网

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
是危险的完全相同。让任务选择允许自己取消的点更为简洁