2015-12-08 48 views
3

我看到CancellationTokenCancellationTokenSource都有IsCancellationRequested getter方法。大多数示例将CancellationToken传递给在Task内执行的方法。它通过使用任何这些看起来对我来说,电话可以返回。如果我使用CancellationTokenSourceIsCancellationRequested,会不会成为问题?当我应该抛出异常(通过使用ThrowIfCancellationRequested)或者只是从方法返回时,如果有取消请求,如下面的代码所示?我应该使用CancellationTokenSource还是CancellationToken取消.NET中的任务

class Program 
{ 
    //If CancellationToken is passed then it behaves in same way? 
    public static int TaskMethod(CancellationTokenSource tokenSource) 
    { 
     int tick = 0; 
     while (!tokenSource.IsCancellationRequested) 
     { 
      Console.Write('*'); 
      Thread.Sleep(500); 
      tick++; 
      //token.Token.ThrowIfCancellationRequested(); 
     } 
     //Should I just return or use ThrowIfCancellationRequested? 
     return tick; 
    } 

    public static void Main() 
    { 
     CancellationTokenSource tokenSource = new CancellationTokenSource(); 
     CancellationToken token = tokenSource.Token; 
     Task<int> task = Task.Factory.StartNew<int>(() => TaskMethod(tokenSource)); 
     Console.WriteLine("Press enter to stop the task"); 
     Console.ReadLine(); 
     tokenSource.Cancel(); 
     Console.WriteLine("{0}", task.Result); 
    } 
} 
+0

请仔细阅读http://stackoverflow.com/questions/14215784/why-cancellationtoken-is-separate-from-cancellationtokensource –

+3

传递的方法'CancellationTokenSource'只有当你想要它做的取消。如果该方法被取消,则将其传递给CancellationToken。 –

回答

1

我认为,CancellationTokenSource被用于启动消除(例如,通过一个另一/父线程)。 CancellationToken.Token是相关CancellationToken,你会传递给像TaskFactory.StartNew()as MSDN says

CancellationTokenSource.IsCancellationRequested属性指示 取消是否已经请求此令牌源,比如由于它的取消方法的调用。

然后Task会监视CancellationToken.IsCancellationRequested以确定何时关闭。

对于财产CancellationToken.IsCancellationRequestedMSDN says

获取取消是否已经请求了此令牌。

综上所述,我想告诉大家,CancellationTokenSource.IsCancellationRequested用于CancellationTokenTaskFactory.StartNew()关联。并且CancellationToken.IsCancellationRequested用于定义是否已为该令牌请求取消。此外,IntelliSense具有与CancellationTokenSource.Token.IsCancellationRequestedCancellationToken.IsCancellationRequested相同的定义。

3
  1. CancellationTokenSource保持和控制CancellationToken实例。预计任务方法将使用取消标记但不对其进行修改。如果您将CancellationTokenSource传递给某个方法,则该方法将完全控制取消标记。所以该方法应该以CancellationToken作为参数。

  2. 取消请求后方法的行为取决于您。如果任务被取消令牌终止,则任务应该处于取消状态(抛出TaskCanceledException)。

相关问题