1、在异步方法中取消异步操作,第一步必须声明CancellationToken和CancellationTokenSource两个类对象,并将两个类通过 CancellationTokenSource 对象的token属性关联;

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token; //将CancellationTokenSource cts对象与CancellationToken token对象关联

2 、通过调用CancellationTokenSource的Cancel()方法使异步方法中或异步方法中的await表达式中的CancellationToken的IsCancellationRequested属性为True,从而终止异步方法或异步方法中的await表达式的执行。

 public async Task RunAsync(CancellationToken ct)//异步方法中多了CancellationToken类类型的形参{if(ct.IsCancellationRequested){return;}await Task.Run(() => CycleMethod(ct), ct);//public static Task Run(Action action, CancellationToken cancellationToken); Action是一个无参数无返回值的委托,为什么CycleMethod方法明明是一个有参数的委托}                                             //确能够在Run中使用

3、异步方法或异步方法中的await表达式都包含一个CancellationToken类型的形参,只要程序调用CancellationTokenSource类的Cancel()方法,异步方法和await表达式中的方法检测到CancellationToken的IsCancellationRequested属性为True都会终止。

程序一:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace _CancellationToken
{class Program{static void Main(string[] args){CancellationTokenSource cts = new CancellationTokenSource();CancellationToken token = cts.Token;        //将CancellationTokenSource cts对象与CancellationToken token对象关联MyClass mc = new MyClass();Task t = mc.RunAsync(token);Thread.Sleep(3000);//等待3秒cts.Cancel();t.Wait();Console.WriteLine("Was Cancelled: {0}",token.IsCancellationRequested);Console.ReadKey();}}class MyClass{public async Task RunAsync(CancellationToken ct)//异步方法中多了CancellationToken类类型的形参{if(ct.IsCancellationRequested){return;}await Task.Run(() => CycleMethod(ct), ct);//public static Task Run(Action action, CancellationToken cancellationToken); Action是一个无参数无返回值的委托,为什么CycleMethod方法明明是一个有参数的委托}                                             //确能够在Run中使用void  CycleMethod(CancellationToken ct){Console.WriteLine("Starting CycleMethod");const int Max = 5;for (int i = 0; i < Max; i++){if (ct.IsCancellationRequested){return;}Thread.Sleep(1000);Console.WriteLine("   {0} of {1} iterations completed",i+1,Max);}}}
}

程序二:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Process
{public partial class Form1 : Form{CancellationTokenSource _cancellationTokenSource;CancellationToken _cancellationToken;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}private async  void btnprocess_Click(object sender, EventArgs e){btnprocess.Enabled = false;_cancellationTokenSource = new CancellationTokenSource();_cancellationToken = new CancellationToken();_cancellationToken = _cancellationTokenSource.Token;                 //使_cancellationTokenSource对象和_cancellationToken对象关联int completedPercent = 0;for (int i = 0; i < 10; i++){if (_cancellationToken.IsCancellationRequested){break;}try                                                              //异步方法中的await表达式异常处理{await Task.Delay(500, _cancellationToken);                    //await Task.Delay(50); 效果一样//Thread.Sleep(1000);completedPercent = (i+1)*10;}catch (TaskCanceledException ex){completedPercent = i * 10;}progressBar1.Value = (i+1) * 10;                                 //设置进度条的值this.textBox1.Text = progressBar1.Value.ToString();              //Text文档中显示进度条的进度值}string message = _cancellationToken.IsCancellationRequested ? string.Format("Process was canceled at {0}%", completedPercent) : "Process completed normally";MessageBox.Show(message,"Completion Status");progressBar1.Value = 0;btnprocess.Enabled = true;btnCancel.Enabled = true;}private void btnCancel_Click(object sender, EventArgs e){if (!btnprocess.Enabled){btnCancel.Enabled = false;_cancellationTokenSource.Cancel();                             //调用CancellationTokenSource中的Cancel方法使CancellationToken中的IsCancellationRequested为True ,设备中的急停响应按钮this.textBox1.Text = "";}}}
}

异步方法中取消异步操作相关推荐

  1. 【异步编程】Part3:取消异步操作

    在.Net和C#中运行异步代码相当简单,因为我们有时候需要取消正在进行的异步操作,通过本文,可以掌握 通过CancellationToken取消任务(包括non-cancellable任务).  早期 ...

  2. 【JavaScript】同步与异步-异步与并行-异步运行机制-为什么要异步编程-异步与回调-回调地狱-JavaScript中的异步操作

    文章目录 1. 同步与异步 1.1 同步行为synchronous 1.1.1 特点 1.1.2 例子 1.2 异步行为asynchronous 1.2.1 必要性 1.2.2 特点 1.2.3 例子 ...

  3. Windows 8 中取消的功能特性

    Windows 是一款跟随时代发展的操作系统,Windows 8 除了有时尚的外观,其各项功能特性也都有所提升,而且很多功能特性得以根据用户的声音做出调整.也许某一个功能至今还未能如您所愿,但可能着实 ...

  4. 在git中取消删除已删除的文件

    本文翻译自:Unstage a deleted file in git Usually, to discard changes to a file you would do: 通常,要放弃对文件的更改 ...

  5. 计算机的关闭程序,电脑中取消关机时强制关闭程序提醒的方法

    一位用户反馈自己的电脑在关机前都会提示没有关闭的程序,需要选择关闭后才能关机,感觉这样非常烦人.那么,电脑中该如何取消关机时强制关闭程序提醒呢?接下来,系统城小编就为大家分享下具体操作方法,让关机更加 ...

  6. Google已开始从Chrome浏览器中取消对 FTP 的支持

    谷歌开发人员希望从Chrome浏览器中取消对FTP支持很久了,在一系列提议的代码更改计划和"意图取消"的呼声中,Chrome的支持FTP协议的时代即将结束. 在多年来创建的一系列关 ...

  7. 如何在微信中取消已授权的第三方应用APP

    由于需要测试微信登录功能,在微信授权登录成功后需要解除绑定功能.一直没有找到对应的方法. 取消已授权的第三方应用APP办法:如何在微信中取消已授权的第三方应用APP

  8. java语言保留结构和联合_Java 语言中取消了联合概念,保留了结构概念。( )_学小易找答案...

    [单选题]Graves病最严重的临床表现是 [判断题]Java 语言中取消了联合概念,保留了结构概念.( ) [单选题]下列关于子类继承父类的成员的描述中,错误的是 . [多选题]冯.诺依曼机确立计算 ...

  9. 在html中取消超链接的下划线

    在html的超链接a标签中取消下划线需要用到text-decoration. a{text-decoration:none; }

  10. Keil中取消结构体对齐的方法

    Keil中取消结构体对齐的方法 我在写通讯协议的时候喜欢使用 Union 的形式将整个数据包按需处理,接收数据时使用数组形式来接收,解析数据则使用结构体形式来解析,伪代码如下. union {uint ...

最新文章

  1. Java txt 下拉刷新_手写上拉加载,下拉刷新(小demo)
  2. jquery给轮播图的第一张设置class样式
  3. Java 中接口和抽象类竟然有 7 点不同?
  4. java 运行war_javaweb项目在Eclipse中启动Tomcat后运行正常,但是打成war包启动后运行异常的问题?...
  5. selenium, firefox, python环境搭建指南
  6. iPhone XS Max第三方售价低于7千元 引用户疯抢
  7. 在 const 和 non-const 重载的成员函数中避免代码重复
  8. Tomcat启动提示At least one JAR was scanned for TLDs yet contained no TLDs
  9. 常用css样式大全以及css属性代码大全
  10. Live reload
  11. Springboot 整合CXF框架
  12. Exploring Plain Vision Transformer Backbones for Object Detection 论文阅读笔记
  13. 写论文需要使用一个Github上的模型取数据,具体要求在代码里
  14. Layui的基本使用(前端登录操作步骤)
  15. windows10只显示图标不显示缩略图
  16. 论MMORPG游戏服务器架构
  17. 小技巧——如何为foxmail中的文字编辑超链接
  18. 基于JAVA人事管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  19. 【dfs序+树状数组】多次更新+求结点子树和操作,牛客小白月赛24 I题 求和
  20. 1014: 统计患病人数

热门文章

  1. django3.1发送邮件指定html正文:content_subtype = “html“
  2. com词根词缀_英语词根词缀,cor和con分别代表什么意思
  3. 如何去做一个完整的网站SEO优化方案!
  4. 基础软件“好用”指南:必须跨越这两道鸿沟!
  5. 历届试题 填字母游戏
  6. 平面设计师需要掌握哪些印刷知识
  7. 苹果电脑忘记开机密码重设教程
  8. MQTT再学习 -- 搭建MQTT服务器及测试
  9. 微信小程序Code获取
  10. Windows10版本一键转换工具