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

Rot*_*eel 5 c# task task-parallel-library

我看到CancellationToken并且CancellationTokenSource都有IsCancellationRequestedgetter方法.大多数示例都传递CancellationToken给在内部执行的方法Task.它通过使用任何这些来看我,电话可以返回.如果我使用IsCancellationRequestedCancellationTokenSource,这将是一个问题吗?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);
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*nov 6

  1. CancellationTokenSource持有和控制CancellationToken实例。任务方法应该使用取消令牌但不修改它。如果传递CancellationTokenSource给一个方法,该方法将完全控制取消令牌。所以该方法应该CancellationToken作为一个参数。

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


Ste*_*pUp 1

在我看来,CancellationTokenSource用于启动取消(例如,通过另一个/父线程)。 CancellationToken.Token是关联的CancellationToken,您将传递给类似 TaskFactory.StartNew() 的东西,如 MSDN 所说

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

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

对于属性CancellationToken.IsCancellationRequested MSDN 说

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

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