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
作为参数
取消请求后方法的行为由您决定。如果任务已被取消令牌终止,则没有规则规定任务应处于取消状态(throwTaskCanceledException
)
请阅读并传递方法aCancellationTokenSource
,前提是您希望它执行取消操作。如果方法是要取消的对象,则向其传递一个CancellationToken
。