C#中的多线程案例

使用Task写一个进度条

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 _5.任务
{public partial class Form1 : Form{Task task = null;// 取消的标识符,专门用来管理Task。CancellationTokenSource对象可以生成CancellationToken// CancellationTokenSource对象还可以取消任务CancellationTokenSource cts;bool isPause = false;  // 是否暂停public Form1(){InitializeComponent();// 实例化取消任务的标识cts = new CancellationTokenSource();// 实例化任务(创建一个分线程)task = new Task(new Action<object>(UpdateProgressBar), 0, cts.Token);}
​private void UpdateProgressBar(object state){while (!cts.IsCancellationRequested && !isPause){task.Wait(100);Invoke(new Action(() =>{state = (int)state + 1;if ((int)state <= 100)progressBar1.Value = (int)state;elsects.Cancel();  // 取消任务后,会影响IsCancellationRequested属性}));}}private void button1_Click(object sender, EventArgs e){task.Start();}
​private void button2_Click(object sender, EventArgs e){isPause = true;}
​private void button3_Click(object sender, EventArgs e){isPause = false;cts = new CancellationTokenSource();task = new Task(new Action<object>(UpdateProgressBar), this.progressBar1.Value, cts.Token);task.Start();}
​private void button4_Click(object sender, EventArgs e){isPause = true;cts.Cancel();}}
}
​

CancellationTokenSource怎么使用

CancellationTokenSource 是.NET中用于异步编程的一个类,它允许你创建一个 CancellationToken,这个令牌可以被传递给异步操作,以便在需要时请求取消操作。以下是 CancellationTokenSource 的基本用法:

创建 CancellationTokenSource

CancellationTokenSource cts = new CancellationTokenSource();

获取 CancellationToken

CancellationTokenSource 实例中获取 CancellationToken,然后将它传递给需要支持取消的异步操作。

CancellationToken token = cts.Token;

传递给异步操作

CancellationToken 作为参数传递给支持取消的异步方法。

await SomeAsyncOperationAsync(token);

请求取消

当你需要取消操作时,调用 CancellationTokenSourceCancel 方法。

cts.Cancel();

处理取消

在异步方法中,检查 CancellationToken 是否被触发,并在需要时处理取消逻辑。

public async Task SomeAsyncOperationAsync(CancellationToken cancellationToken)
{try{while (!cancellationToken.IsCancellationRequested){// 执行一些工作
​// 定期检查取消请求cancellationToken.ThrowIfCancellationRequested();
​// 模拟工作延迟await Task.Delay(1000);}}catch (OperationCanceledException){// 处理取消操作Console.WriteLine("Operation was canceled.");}
}

完整示例

class Program
{static async Task Main(string[] args){CancellationTokenSource cts = new CancellationTokenSource();CancellationToken token = cts.Token;
​// 启动异步操作Task asyncOperation = SomeAsyncOperationAsync(token);
​// 假设5秒后用户请求取消await Task.Delay(5000);cts.Cancel();
​try{// 等待异步操作完成或抛出异常await asyncOperation;}catch (OperationCanceledException){Console.WriteLine("The operation was canceled.");}}
​static async Task SomeAsyncOperationAsync(CancellationToken cancellationToken){for (int i = 0; i < 10; i++){Console.WriteLine($"Working... {i}");await Task.Delay(1000, cancellationToken);
​if (cancellationToken.IsCancellationRequested){Console.WriteLine("Cancellation was requested.");throw new OperationCanceledException(cancellationToken);}}}
}

SomeAsyncOperationAsync 方法执行一些工作,并定期检查是否收到了取消请求。如果在5秒后调用了 cts.Cancel(),那么 CancellationTokenSource 会发出取消请求,并且异步操作将捕获 OperationCanceledException 异常来处理取消。

使用 CancellationTokenSourceCancellationToken 提供了一种优雅的方式来请求和响应取消操作,使异步编程更加灵活和健壮。

使用Task写一个进度条

using System;
using System.Threading;
using System.Windows.Forms;
​
namespace _2.Thread课堂练习
{public partial class Form1 : Form{Thread t = null; // 线程实例bool isCancel = false; // 取消标识public Form1(){InitializeComponent();
​t = new Thread(UpdateProgressBar);this.button2.Enabled = false;this.button3.Enabled = false;this.button4.Enabled = false;}
​private void UpdateProgressBar(object step){while (!isCancel && t != null && Convert.ToInt32(step) < 100){Thread.Sleep(100);step = Convert.ToInt32(step) + 1;
​if (Convert.ToInt32(step) <= 100){Invoke(new Action(() =>{progressBar1.Value = Convert.ToInt32(step);}));}else{isCancel = true;}}}
​private void button1_Click(object sender, EventArgs e){t?.Start(0);this.button1.Enabled = false;this.button2.Enabled = true;this.button4.Enabled = true;}
​private void button2_Click(object sender, EventArgs e){t?.Suspend();this.button2.Enabled = false;this.button3.Enabled = true;}
​private void button3_Click(object sender, EventArgs e){t?.Resume();this.button2.Enabled = true;this.button3.Enabled = false;this.button4.Enabled = true;}
​private void button4_Click(object sender, EventArgs e){isCancel = true;t?.Abort();this.button1.Enabled = true;this.button2.Enabled = false;this.button3.Enabled = false;this.button4.Enabled = false;t = new Thread(UpdateProgressBar);progressBar1.Value = 0;isCancel = false;}
​private void Form1_FormClosing(object sender, FormClosingEventArgs e){isCancel = true;t?.Abort();}
​private void Form1_Load(object sender, EventArgs e){
​}}
}

注意:Invoke里面不能写卡线程的东西,Invoke里面操作的是主线程里面的东西

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/401698.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker——常用命令

1.Docker是做什么的&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。它可以帮助我们下载应用镜像&#xff0c;创建并运行镜…

Spring DI 简单演示三层架构——Setter 注入

Spring IOC 的常见注入方法有3种&#xff1a;Setter注入、构造注入和属性注入。想了解更多可点击链接&#xff1a;Spring 注入、注解以及相关内容补充 属性注入 不推荐。原因&#xff1a;使用私有的成员属性变量&#xff0c;依靠反射实现&#xff0c;破坏封装&#xff0c;只能依…

opencv 控制鼠标键盘实现功能setMouseCallback

鼠标事件类型 OpenCV 支持多种鼠标事件类型&#xff0c;常见的包括&#xff1a; cv2.EVENT_LBUTTONDOWN&#xff1a;左键按下 cv2.EVENT_RBUTTONDOWN&#xff1a;右键按下 cv2.EVENT_MBUTTONDOWN&#xff1a;中键按下 cv2.EVENT_LBUTTONUP&#xff1a;左键释放 cv2.EVENT_RBUTT…

HOW - 用腾讯蓝盾部署一个 Web 应用

目录 一、介绍二、项目、流水线和 Stage1. 项目&#xff08;Project&#xff09;2. 流水线&#xff08;Pipeline&#xff09;3. Stage&#xff08;阶段&#xff09;示例&#xff1a;配置一个简单的 CI/CD 流程的基本步骤总结 三、一条完整的流水线包括什么 Stage1. 源代码管理&…

数据库-DML语言-数据操作语言

定义 DML是对表中数据进行操作的语言&#xff0c;涉及的关键字:INSERT UPDATE DELETE INSERT:向表中插入新数据的语句UPDATE:修改表中数据的语句DELETE:删除表中数据的语句 准备工作 USE mydb; 使用mydb库 CREATE TABLE person( 创建表personname VARCHAR(30),age INT…

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1

系统版本: ky10.x86_64 下载安装包并上传 openssh下载地址 https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable openssl下载地址 https://openssl-library.org/source/index.html zlib下载地址 https://zlib.net/fossils/ 上传安装包 备份配置文件 cp -r /etc/ssh /et…

高德地图SDK Android版开发 5 地图交互操作

高德地图SDK Android版开发 5 地图交互操作 前言控件控件介绍接口UiSettingsAMapOptions 示例代码Logo指南针比例尺缩放按钮 效果图 地图手势地图手势方法说明地图手势开关指定屏幕中心点的手势操作 地图手势事件地图点击事件监听接口地图长按事件监听接口地图触摸事件监听接口…

Python 6行代码写北京时间时钟(10帧 可调) 天地良心

今天看到别的大佬用Python写时钟 我密集恐惧症都犯了 十来个定义函数 我看也看不懂 代码还有整整78行 还是在我改良后的 改良前有98行 我删注释 优化函数名(比如把penup改成pu) 这个文件照样有5KB 并且在帧数取决于电脑性能 我运行了一下 电脑都卡出蓝屏了 于是我连夜赶…

云动态摘要 2024-08-12

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 全球加速 GA - 新增“巴西&#xff08;圣保罗&#xff09;”、“沙特&#xff08;利雅得&#xff09;”接入点 华为云 2024-08-12 全球加速服务新增开通“巴西&#xff08;圣保罗&#xff09;”、“沙特&a…

CAN总线-----帧格式

目录 前言 一、CAN总线帧格式分类 1.数据帧&#xff08;重点&#xff09; 2.遥控帧 3.错误帧 4.过载帧 5.间隔帧 二、位填充 三、波形实例 前言 本期我们就开始学习CAN总线的帧格式&#xff0c;对应帧格式的话&#xff0c;在前面我们学习I2C协议和SPI协议等协议的时候…

使用功率器件比如MOSFET瞬态热阻曲线计算参数

使用功率器件比如MOSFET瞬态热阻曲线计算参数 1.概述2.查看 ZθJC 图3.使用 ZθJC 图估算结温升4.应用案例5.使用 ZθJC 图估算 MOSFET 峰值电流能力6.应用实例 资料来自网络&#xff0c;仅供学习使用 1.概述 功率 MOSFET 数据表包括归一化瞬态热阻抗图&#xff1a;结至外壳 …

怎么将pdf转为ppt文件?pdf转ppt的8个方法

在诸多职场与学术交流的场合中&#xff0c;我们时常面临将详尽的PDF文件转化为生动且易于编辑的PPT演示文稿的需求。这一转换不仅是为了满足演示时的灵活性&#xff0c;更是为了提升信息传递的效率与观众的理解度。从简单的在线工具到功能全面的专业软件&#xff0c;我们拥有多…

概要设计遇到需求变更,6大应对措施

有效地应对概念设计过程中的需求变更&#xff0c;有助于项目灵活适应市场与用户变化&#xff0c;减少后期调整成本&#xff0c;提升产品竞争力与用户满意度&#xff0c;促进项目顺利推进和高质量交付。未能及时有效应对概念设计中的需求变更&#xff0c;往往会导致项目偏离原定…

“论NoSQL数据库技术及其应用”写作框架,软考高级,系统架构设计师

论文真题 随着互联网web2.0网站的兴起&#xff0c;传统关系数据库在应对web2.0 网站&#xff0c;特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心&#xff0c;暴露了很多难以克服的问题&#xff0c;而非关系型的数据库则由于其本身的特点得到了非常迅速的发展…

[C++] STL (multi)map/(multi)set简介

标题&#xff1a;[C] STL (multi)map/(multi)set简介 水墨不写bug 目录 前言&#xff1a; 一、set简介 1.set简介 2.set的常见用法 二、map简介 1.map简介 2.map使用 三、multiset简介 1.multiset简介 2.multiset使用 四、multimap简介 1.multimap简介 2.multim…

24小时不间断守护:输电线路防山火在线监测装置|防山火利器

24小时不间断守护&#xff1a;输电线路防山火在线监测装置|防山火利器 “一年之计在于秋”虽然传统上强调秋季作为收获与规划的重要时节&#xff0c;但同时也提醒我们&#xff0c;这个季节也伴随着一系列的自然挑战&#xff0c;如火灾风险的增加。针对输电线路而言&#xff0c…

制造业生产管理的困境及MES系统解决方案介绍:盘古信息IMS

在当今竞争激烈的制造业环境中&#xff0c;企业面临着前所未有的生产管理挑战。从计划执行的灵活性不足、过程监控的缺失&#xff0c;到质量控制的挑战、供应链协同的难题&#xff0c;每一个环节都亟需创新与优化。盘古信息MES系统&#xff0c;作为全球领先的制造运营管理工业软…

秋招突击——8/15——知识补充——垃圾回收机制

文章目录 引言正文指针引用可达性分析算法垃圾回收算法标记清除算法标记整理算法复制分代收集 垃圾收集器Serial收集器ParNew并行收集器Parallel Scavenge吞吐量优先收集器Serial Old老年代收集器Parallel old收集器CMS收集器G1收集器&#xff08;Garbage First垃圾优先&#x…

MySQL:查询(万字超详细版)

&#x1f48e;所属专栏&#xff1a; MySQL &#x1f48e;1. 单表查询 &#x1f48e;1.1 全列查询和指定列查询 全列查询&#xff1a; select * from exam; 在实际开发中不要使用 * 来进行查询&#xff0c;因为数据库会很大&#xff0c;影响效率 指定列查询&#xff1a; se…

IPC进程间通信

信号 信号是一种终端机制&#xff0c;程序运行到一半的时候接收到了某种通知&#xff0c;程序就会立刻中断运行&#xff0c;转而去处理通知。 登记信号 一个进程只会接收默认的几个信号 如果想要让一个进程接收特定信号的话&#xff0c;必须提前在该进程中登记一下想要接收…