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

C# 我应该使用CancellationTokenSource还是CancellationToken来取消.NET中的任务,c#,task-parallel-library,task,C#,Task Parallel Library,Task,我看到CancellationToken和CancellationTokenSource都有iscancellationrequestgetter方法。大多数示例将CancellationToken传递给在任务中执行的方法。在我看来,通过使用其中任何一个,呼叫都可以返回。如果我使用CancellationTokenSource的IsCancellationRequested,会有问题吗?我应该在什么时候抛出异常(通过使用ThrowIfCancellationRequested),或者如果有如下代

我看到
CancellationToken
CancellationTokenSource
都有
iscancellationrequest
getter方法。大多数示例将
CancellationToken
传递给在
任务中执行的方法。在我看来,通过使用其中任何一个,呼叫都可以返回。如果我使用
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);
    }
}
类程序
{
//如果传递了CancellationToken,那么它的行为方式是否相同?
公共静态int TaskMethod(CancellationTokenSource tokenSource)
{
int tick=0;
而(!tokenSource.IsCancellationRequested)
{
Console.Write('*');
睡眠(500);
tick++;
//token.token.ThrowIfCancellationRequested();
}
//我应该返回还是使用ThrowIfCancellationRequested?
返回勾号;
}
公共静态void Main()
{
CancellationTokenSource tokenSource=新的CancellationTokenSource();
CancellationToken=tokenSource.token;
Task Task=Task.Factory.StartNew(()=>TaskMethod(tokenSource));
Console.WriteLine(“按enter键停止任务”);
Console.ReadLine();
tokenSource.Cancel();
WriteLine(“{0}”,task.Result);
}
}

在我看来,
CancellationTokenSource
用于启动取消(例如,由另一个/父线程启动)
CancellationToken.Token
是关联的
CancellationToken
,您将传递给类似TaskFactory.StartNew()的对象:

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

然后,
任务
将监视
CancellationToken.IsCancellationRequested
以确定何时关闭

对于属性
CancellationToken.IsCancellationRequested

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

总之,我想告诉大家,
CancellationTokenSource.IsCancellationRequested
用于将
CancellationToken
TaskFactory.StartNew()关联起来。和
CancellationToken.IsCancellationRequested
用于定义是否已为此令牌请求取消。此外,
IntelliSense
CancellationTokenSource.Token.IsCancellationRequested
CancellationToken.IsCancellationRequested
具有相同的定义

  • CancellationTokenSource
    保存并控制
    CancellationToken
    实例。任务方法应使用取消令牌,但不修改它。如果将
    CancellationTokenSource
    传递给一个方法,该方法将完全控制取消令牌。因此,该方法应采用
    CancellationToken
    作为参数

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


  • 请阅读并传递方法a
    CancellationTokenSource
    ,前提是您希望它执行取消操作。如果方法是要取消的对象,则向其传递一个
    CancellationToken