异步方法中取消异步操作
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 = "";}}}
}
异步方法中取消异步操作相关推荐
- 【异步编程】Part3:取消异步操作
在.Net和C#中运行异步代码相当简单,因为我们有时候需要取消正在进行的异步操作,通过本文,可以掌握 通过CancellationToken取消任务(包括non-cancellable任务). 早期 ...
- 【JavaScript】同步与异步-异步与并行-异步运行机制-为什么要异步编程-异步与回调-回调地狱-JavaScript中的异步操作
文章目录 1. 同步与异步 1.1 同步行为synchronous 1.1.1 特点 1.1.2 例子 1.2 异步行为asynchronous 1.2.1 必要性 1.2.2 特点 1.2.3 例子 ...
- Windows 8 中取消的功能特性
Windows 是一款跟随时代发展的操作系统,Windows 8 除了有时尚的外观,其各项功能特性也都有所提升,而且很多功能特性得以根据用户的声音做出调整.也许某一个功能至今还未能如您所愿,但可能着实 ...
- 在git中取消删除已删除的文件
本文翻译自:Unstage a deleted file in git Usually, to discard changes to a file you would do: 通常,要放弃对文件的更改 ...
- 计算机的关闭程序,电脑中取消关机时强制关闭程序提醒的方法
一位用户反馈自己的电脑在关机前都会提示没有关闭的程序,需要选择关闭后才能关机,感觉这样非常烦人.那么,电脑中该如何取消关机时强制关闭程序提醒呢?接下来,系统城小编就为大家分享下具体操作方法,让关机更加 ...
- Google已开始从Chrome浏览器中取消对 FTP 的支持
谷歌开发人员希望从Chrome浏览器中取消对FTP支持很久了,在一系列提议的代码更改计划和"意图取消"的呼声中,Chrome的支持FTP协议的时代即将结束. 在多年来创建的一系列关 ...
- 如何在微信中取消已授权的第三方应用APP
由于需要测试微信登录功能,在微信授权登录成功后需要解除绑定功能.一直没有找到对应的方法. 取消已授权的第三方应用APP办法:如何在微信中取消已授权的第三方应用APP
- java语言保留结构和联合_Java 语言中取消了联合概念,保留了结构概念。( )_学小易找答案...
[单选题]Graves病最严重的临床表现是 [判断题]Java 语言中取消了联合概念,保留了结构概念.( ) [单选题]下列关于子类继承父类的成员的描述中,错误的是 . [多选题]冯.诺依曼机确立计算 ...
- 在html中取消超链接的下划线
在html的超链接a标签中取消下划线需要用到text-decoration. a{text-decoration:none; }
- Keil中取消结构体对齐的方法
Keil中取消结构体对齐的方法 我在写通讯协议的时候喜欢使用 Union 的形式将整个数据包按需处理,接收数据时使用数组形式来接收,解析数据则使用结构体形式来解析,伪代码如下. union {uint ...
最新文章
- Java txt 下拉刷新_手写上拉加载,下拉刷新(小demo)
- jquery给轮播图的第一张设置class样式
- Java 中接口和抽象类竟然有 7 点不同?
- java 运行war_javaweb项目在Eclipse中启动Tomcat后运行正常,但是打成war包启动后运行异常的问题?...
- selenium, firefox, python环境搭建指南
- iPhone XS Max第三方售价低于7千元 引用户疯抢
- 在 const 和 non-const 重载的成员函数中避免代码重复
- Tomcat启动提示At least one JAR was scanned for TLDs yet contained no TLDs
- 常用css样式大全以及css属性代码大全
- Live reload
- Springboot 整合CXF框架
- Exploring Plain Vision Transformer Backbones for Object Detection 论文阅读笔记
- 写论文需要使用一个Github上的模型取数据,具体要求在代码里
- Layui的基本使用(前端登录操作步骤)
- windows10只显示图标不显示缩略图
- 论MMORPG游戏服务器架构
- 小技巧——如何为foxmail中的文字编辑超链接
- 基于JAVA人事管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
- 【dfs序+树状数组】多次更新+求结点子树和操作,牛客小白月赛24 I题 求和
- 1014: 统计患病人数
热门文章
- django3.1发送邮件指定html正文:content_subtype = “html“
- com词根词缀_英语词根词缀,cor和con分别代表什么意思
- 如何去做一个完整的网站SEO优化方案!
- 基础软件“好用”指南:必须跨越这两道鸿沟!
- 历届试题 填字母游戏
- 平面设计师需要掌握哪些印刷知识
- 苹果电脑忘记开机密码重设教程
- MQTT再学习 -- 搭建MQTT服务器及测试
- 微信小程序Code获取
- Windows10版本一键转换工具