2011-03-02 126 views
10

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

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

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

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

回答

29

取消令牌不会奇迹般地取消任何内容。他们只需即可让以标准化方式检查取消,例如,通过ThrowIfCancellationRequested

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

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