一、概述
在讲任务取消之前,得先了解取消令牌跟取消令牌源,实现任务取消功能的就是依靠这两个。
CancellationTokenSource:取消令牌源类,拥有Cancel()方法,可以给关联的令牌发送取消信号。
CancellationToken:取消令牌,结构体,拥有ThrowIfCancellationRequested()方法可以抛出异常,让任务状态变成Canceled。
二、取消任务具体实现流程
1、声明并new创建令牌源;
var tokenSource = new CancellationTokenSource();
2、声明令牌,并关联取消令牌源;
CancellationToken ct = tokenSource.Token;
3、创建任务,通过构造函数传递令牌给任务实例,并通过委托传递令牌给任务内的执行方法(注意:令牌将传递给用户委托和任务实例,要传两次);
var longTask = new Task<int>(() => TaskMathod("Task 1", 10, ct),ct);
4、当前线程通过取消令牌源调用Cancel()方法
tokenSource.Cancel();
5、任务内通过判断是否收到取消请求,决定是否调用ThrowIfCancellationRequested()方法抛出异常取消任务
static int TaskMathod(string name,int seconds,CancellationToken token){ Console.WriteLine($"Task {name} is running on a thread, " + $"id {CurrentThread.ManagedThreadId} is threadpool thread ? " + $"{CurrentThread.IsThreadPoolThread}"); for (int i = 0; i < seconds; i++) { Sleep(TimeSpan.FromSeconds(0.5)); if (token.IsCancellationRequested) //判断是否收到取消请求 { return -1; } } return seconds * 10; }
三、注意事项
取消任务有两种方式:
1、通过从委托返回。在许多情况下,此选项就足够了。但是,以这种方式取消的任务实例将转换为 TaskStatus.RanToCompletion 状态,而不是 TaskStatus.Cancel 状态。
2、通过抛出 OperationCanceledException 并向其传递请求取消的令牌。首选的执行方法是使用 ThrowIfCancellationRequest 方法。
第一种方式可以不用传令牌给task实例。
标签:令牌,取消,CancellationTokenSource,C#,任务,实例,Cancel From: https://www.cnblogs.com/Darius0821/p/16615690.html