我应该使用CancellationTokenSource还是CancellationToken来取消.NET中的任务
本文关键字:NET 取消 任务 CancellationToken CancellationTokenSource 还是 我应该 | 更新日期: 2023-09-27 18:26:07
我看到CancellationToken
和CancellationTokenSource
都有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);
}
}
-
CCD_ 9保持并控制CCD_。任务方法应该使用取消令牌,但不能修改它。如果将
CancellationTokenSource
传递给方法,该方法将完全控制取消令牌。因此,该方法应以CancellationToken
为参数。 -
取消请求后方法的行为由您决定。如果任务已被取消令牌终止,则不存在任务应处于取消状态(抛出
TaskCanceledException
)的规则。
在我看来,CancellationTokenSource
用于启动取消(例如,由另一个/父线程执行)。CancellationToken.Token
是相关联的CancellationToken
,您可以将其传递给TaskFactory.StartNew()之类的东西,正如MSDN所说:
CancellationTokenSource.IsCancellationRequested
属性表示已为此令牌源请求取消,例如由于调用了其Cancel方法。
然后CCD_ 18将监视CCD_ 19以确定何时关闭。
对于属性CancellationToken.IsCancellationRequested
MSDN表示:
获取是否已为此令牌请求取消。
总之,我想告诉大家,CancellationTokenSource.IsCancellationRequested
用于将CancellationToken
与TaskFactory.StartNew()
相关联。并且CCD_ 24用于定义是否已经针对该令牌请求了取消。此外,IntelliSense
对CancellationTokenSource.Token.IsCancellationRequested
和CancellationToken.IsCancellationRequested
具有相同的定义。