首页 > 编程语言 >C#任务取消--CancellationTokenSource取消令牌源

C#任务取消--CancellationTokenSource取消令牌源

时间:2022-08-23 12:12:44浏览次数:87  
标签:令牌 取消 CancellationTokenSource C# 任务 实例 Cancel

一、概述

  在讲任务取消之前,得先了解取消令牌跟取消令牌源,实现任务取消功能的就是依靠这两个。

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

相关文章