首页 > 编程语言 >【笔记】C# CancellationToken

【笔记】C# CancellationToken

时间:2024-05-04 23:23:24浏览次数:24  
标签:CancellationToken Console C# System 笔记 取消 Token using

.NET 提供了一个类方便用来发出操作取消的信号,这个类就是CancellationToken,它的好处在于它可以在任意数量的线程之间、线程池任务之间、Task之间传递信号,并且所需的代码很简单。通常用于下载超时中断、用户取消任务等情况。

CancellationToken 通常搭配 CancellationTokenSource 使用,后者是前者的一个管理类,使用 CancellationTokenSource 的 Token 属性,可以获取CancellationToken,并控制信号的发送。这两个类都属于命名空间 System.Threading

在异步编程中,只需将 Token 作为一个参数传入异步方法中。在异步方法外便能通过 CancellationTokenSource.Cancel 方法发出取消信号或者 CancelAfter 方法在一段时间后发出取消信号,这会改变 Token 的 isCancellationRequested 属性。在异步方法内,通过这个属性获取取消信号,并作出对应的处理操作。

例如下面的代码:

using System;
using System.Threading.Tasks;
using System.Threading;
using System.Net.Http;

namespace CancellationTokenTest
{
    class Program
    {
        static async Task Main(string[] args)
        {
            CancellationTokenSource cts = new CancellationTokenSource();
            //cts.Cancel() //立即发出取消信号
            //3秒后发出取消信号,模拟取消行为
            cts.CancelAfter(3000);
            Console.WriteLine("下载开始");
            await DownloadAsync(cts.Token);
            Console.ReadKey();
        }

        static async Task DownloadAsync(CancellationToken ct)
        {
            using (HttpClient client = new HttpClient())
            {
                //模拟一个比较耗时的下载的过程
                for (int i = 0; i < 30; i++)
                {
                    string s = await client.GetStringAsync("https://kfm.ink");
                    Console.WriteLine(s);

                    //ct.ThrowIfCancellationRequested();//直接抛出异常
                    //判断是否需要取消,并自行处理
                    if (ct.IsCancellationRequested)
                    {
                        Console.WriteLine("下载取消");
                        break;
                    }
                }
                
            }
        }

    }
}
这里除了通过 IsCancellationRequested 属性判断是否需要取消外,还可以通过 ThrowIfCancellationRequested 方法在需要取消时立即抛出异常,该异常是 OperationCanceledException

.NET 很多库的异步方法都可以传入 Token,使用时传入该参数可以降低代码的粒度,例如上面这个例子,至少执行一次 GetStringAsync 才有可能中断,而这一次执行可能耗费大量的时间,通过使用 GetAsync 方法可以解决这个问题:

//传入Token
HttpResponseMessage response = await client.GetAsync("https://kfm.ink/", ct);
string s = await response.Content.ReadAsStringAsync();
Console.WriteLine(s);

标签:CancellationToken,Console,C#,System,笔记,取消,Token,using
From: https://www.cnblogs.com/brucewanglove/p/18172949

相关文章

  • C++-研讨会(全)
    C++研讨会(全)原文:annas-archive.org/md5/5ba4b421a6ba3d7c3a23406bab386ec0译者:飞龙协议:CCBY-NC-SA4.0前言关于本书C#是一种强大而多才多艺的面向对象编程(OOP)语言,可以打开各种职业道路。但是,与任何编程语言一样,学习C#可能是具有挑战性的。由于有各种不同的资源可用,很难......
  • 自动配置网络----DHCP
    DHCP工作原理Discover(发现):在DHCP获取过程中,客户端首先广播一个Discover报文,该报文表明客户端想要加入网络,并请求IP地址分配。Offer(提供):DHCP服务器收到客户端的Discover报文后,会向客户端发送一个Offer报文,其中包含一个可用的IP地址及相关网络配置信息。Request(请求):客户......
  • AtCoder Beginner Contest 352 考试总结
    前言正常发挥。属于是\(4\)个月没搞OI,复健成功了!得分明细:ABCDEFGTotal√√√√√××1475改题明细:ABCDEFG√√√√√××第一次正式rated打AT,行吧!A.AtCoderLineProblemAtCoder铁路线有\(N\)个车站,编号为\(1......
  • solid在css中什么意思
    solid在CSS中的含义在CSS中,solid是一个用于定义边框样式的关键词。作用solid用于创建一个具有实线边框的元素。实线边框是一种连续且不间断的线条,将其应用于元素周围可强调或定义其边界。语法该关键词用于border-style属性,它用于设置元素边框的样式。该属性的语法如......
  • REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS
    发表时间:2023(ICLR2023)文章要点:文章提出一个简单有效的ReAct框架,将reasoning和action结合,在交互式的环境上进行测试,取得了很好的效果。其中reasoning作为推理模块,帮助模型归纳,跟踪和更新动作规划,acting和环境交互收集更多信息(reasoningtraceshelpthemodelinduce,track,a......
  • C++-专家编程(全)
    C++专家编程(全)原文:annas-archive.org/md5/57ea316395e58ce0beb229274ec493fc译者:飞龙协议:CCBY-NC-SA4.0前言学习路径和技术简介。这个学习路径适合谁这个学习路径适合想要提升并学习如何在最新版本的Java中构建健壮应用程序的Java开发人员。这个学习路径涵盖了什......
  • C++-游戏动画编程实用指南(全)
    C++游戏动画编程实用指南(全)原文:annas-archive.org/md5/1ec3311f50b2e1eb4c8d2a6c29a60a6b译者:飞龙协议:CCBY-NC-SA4.0前言现代游戏动画有点像黑魔法。没有太多资源详细介绍如何构建基于轨道驱动的动画系统,或者高级主题,比如双四元数蒙皮。这本书的目标就是填补这个空白。......
  • AtCoder abc352
    EProblemStatementYouaregivenaweightedundirectedgraph$G$with$N$vertices,numbered$1$to$N$.Initially,$G$hasnoedges.Youwillperform$M$operationstoaddedgesto$G$.The$i$-thoperation$$(1\leqi\leqM)$$isasfollows:Youar......
  • C# dataGridView控件实用属性及事件总结
    一、C#winformDataGridView属性说明①取得或者修改当前单元格的内容 ②设定单元格只读 ③不显示最下面的新行 ④判断新增行 ⑤行的用户删除操作的自定义 ⑥行、列的隐藏和删除 ⑦禁止列或者行的Resize ⑧列宽和行高以及列头的高度和行头的宽度的自动调......
  • CyberRT_概念组件以及基本流程
    CyberRT两大功能任务调度数据通信基本组件componentnodechannelreader/writersevice/clientTaskroutine通信1.通信的方式:01.intras-process02.sharedMemory 03.socket--fastRTPSDDS也是采用发布/订阅机制进行网络通讯通过抽象出DDS接口,让RO......