我应该使用CancellationTokenSource还是CancellationToken来取消.NET中的任务

本文关键字:NET 取消 任务 CancellationToken CancellationTokenSource 还是 我应该 | 更新日期: 2023-09-27 18:26:07

我看到CancellationTokenCancellationTokenSource都有IsCancellationRequested getter方法。大多数示例将CancellationToken传递给在Task内部执行的方法。在我看来,通过使用任何这些,呼叫都可以返回。如果我使用CancellationTokenSource中的IsCancellationRequested,会有问题吗?如果有如下代码所示的取消请求,我应该在什么时候抛出异常(通过使用ThrowIfCancellationRequested)或从方法返回?

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

我应该使用CancellationTokenSource还是CancellationToken来取消.NET中的任务

  1. CCD_ 9保持并控制CCD_。任务方法应该使用取消令牌,但不能修改它。如果将CancellationTokenSource传递给方法,该方法将完全控制取消令牌。因此,该方法应以CancellationToken为参数。

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

在我看来,CancellationTokenSource用于启动取消(例如,由另一个/父线程执行)。CancellationToken.Token是相关联的CancellationToken,您可以将其传递给TaskFactory.StartNew()之类的东西,正如MSDN所说:

CancellationTokenSource.IsCancellationRequested属性表示已为此令牌源请求取消,例如由于调用了其Cancel方法。

然后CCD_ 18将监视CCD_ 19以确定何时关闭。

对于属性CancellationToken.IsCancellationRequested MSDN表示:

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

总之,我想告诉大家,CancellationTokenSource.IsCancellationRequested用于将CancellationTokenTaskFactory.StartNew()相关联。并且CCD_ 24用于定义是否已经针对该令牌请求了取消。此外,IntelliSenseCancellationTokenSource.Token.IsCancellationRequestedCancellationToken.IsCancellationRequested具有相同的定义。