C#_多线程编程入门

字面理解:多个线程同时工作的过程。

案例①   单线程

        #region ① 单线程做菜/// <summary>/// ① 单线程做菜:执行任务时,什么操作都动不了./// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void SingleThread_Click(object sender, EventArgs e){Thread.Sleep(3000);MessageBox.Show("素菜做好了","友情提示");Thread.Sleep(3000);MessageBox.Show("荤菜做好了", "友情提示");}#endregion

单线程_效果

做菜(先做完素菜,再做荤菜)时,当前窗口无法操作(移动、拉伸等)。

案例②  多线程

        #region ② 多线程做菜/// <summary>/// ② 多线程做菜:执行任务时,可以对其他功能操作/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void multiThreading_Click(object sender, EventArgs e){Thread thread = new Thread(() =>{Thread.Sleep(3000);MessageBox.Show("素菜做好了", "友情提示");Thread.Sleep(5000);MessageBox.Show("荤菜做好了", "友情提示");});thread.Start();}#endregion

多线程_效果

做菜(先做完素菜,再做荤菜)时,当前窗口进可以行操作(移动、拉伸等)。

案例③  任务

        #region ③ 任务做菜/// <summary>/// ③ 任务做菜:执行任务时,可以对其他功能操作/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnTask_Click(object sender, EventArgs e){Task.Run(() =>{Thread.Sleep(3000);MessageBox.Show("素菜做好了", "友情提示");Thread.Sleep(5000);MessageBox.Show("荤菜做好了", "友情提示");});}#endregion

任务_效果

做菜(先做完素菜,再做荤菜)时,当前窗口进可以行操作(移动、拉伸等)。

案例④  同步

        #region ④ 同步做菜/// <summary>/// ④ 同步做菜:同时运行任务/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSynchornization_Click(object sender, EventArgs e){Task.Run(() =>{Thread.Sleep(3000);MessageBox.Show("素菜做好了", "友情提示");});Task.Run(() =>{Thread.Sleep(5000);MessageBox.Show("荤菜做好了", "友情提示");});}#endregion

同步_效果

素菜和荤菜可以同时做,当前窗口进可以行操作(移动、拉伸等)。

案例⑤  异步

        #region 做好菜了,来吃饭(异步)/// <summary>/// ⑤ 做好菜了,来吃饭(异步):等待任务完成后,才继续往下执行./// </summary>/// <param name="sender"></param>/// <param name="e"></param>private async void btnAsync_Click(object sender, EventArgs e){await Task.Run(() =>{Thread.Sleep(3000);MessageBox.Show("素菜做好了", "友情提示");Thread.Sleep(5000);MessageBox.Show("荤菜做好了", "友情提示");});MessageBox.Show("做好菜了,来吃饭", "友情提示");}#endregion

异步_效果

等待完成这个任务完成后,才执行“来吃饭”;UI和逻辑不在同个线程。

案例⑥  并行

        #region ⑥ 做好菜了,来吃饭(并行)/// <summary>/// ⑥ 做好菜了,来吃饭(并行):异步完成任务后,才继续往下执行./// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnParallel_Click(object sender, EventArgs e){//1. 创建泛型为Task的集合对象List<Task> Ltasks = new List<Task>();//2. 添加任务Ltasks.Add(Task.Run(() =>{Thread.Sleep(3000);MessageBox.Show("素菜做好了", "友情提示");}));Ltasks.Add(Task.Run(() =>{Thread.Sleep(5000);MessageBox.Show("荤菜做好了", "友情提示");}));//3. 将所有Task对象完成后,创建新的异步延续任务Task.WhenAll(Ltasks).ContinueWith(ts =>{MessageBox.Show("做好菜了,来吃饭", "友情提示");});}#endregion

并行_效果

等待完成所有任务完成后,才执行“来吃饭”;UI和逻辑不在同个线程。

案例⑦  使用线程组件跨线程传输信息和状态

namespace MyWorkBook.MyTest
{public partial class ThreadForm : Form{public ThreadForm(){InitializeComponent();backgroundWorker1.WorkerReportsProgress = true;//是否支持发送进度报告。backgroundWorker1.WorkerSupportsCancellation = true;//是否支持取消异步操作。}/// <summary>/// 线程控件触发事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){//通过Object对象可以获取线程组件;以下代码会另起一个线程,而不是在UI线程中运行。BackgroundWorker worker = sender as BackgroundWorker;for(int i = 1; i <= 100; i++){if(worker.CancellationPending == true)//应用程序已请求取消后台操作{e.Cancel = true;//取消事件--更改运行返回状态,并不能取消停止break;}else{Thread.Sleep(50);//实际应用编码时,该程式是为工作代码。worker.ReportProgress(i);//当线程进度发给改变时,触发线程组件发生改变后触发事件(backgroundWorker1_ProgressChanged)并传参。
/*发送*/var data = Tuple.Create("Hallen",true,27);//创建元数组数据。worker.ReportProgress(i, data);}}e.Result = e.Argument;//根据操作异步参数给操作异步结果赋值---应用于线程完成(失败/成功)后触发事件。}/// <summary>/// 线程组件发生改变后触发事件---在创建BackgroundWorker线程上执行,是异步调用,和引发事件代码是在不同线程。/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e){progressBar1.Value = e.ProgressPercentage;//将异步任务进度百分比赋值给进度条resultLabel.Text = (e.ProgressPercentage.ToString() + "%");//将异步任务进度百分比赋值给标签组件显示进度数值/*接收---跨线程接收信息和状态*/if(e.UserState != null){Tuple<string, bool, int> data = (Tuple<string, bool, int>)e.UserState;lbl_state.Text = $"姓名{data.Item1},性别{data.Item2},年龄{data.Item3}";}            }/// <summary>/// 启动按钮触发事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){if(backgroundWorker1.IsBusy != true)//判断异步操作不在进行{backgroundWorker1.RunWorkerAsync("你是坏淫吗?对,你是的。");//开始异步操作}}/// <summary>/// 取消按钮触发事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button2_Click(object sender, EventArgs e){if(backgroundWorker1.WorkerSupportsCancellation == true)//判断支持异步取消操作{backgroundWorker1.CancelAsync();//请求取消挂起后台操作}}/// <summary>/// 线程完成(失败/成功)后触发事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){if(e.Cancelled == true)//后台操作已取消{resultLabel.Text = "Canceled";}else if(e.Error != null)//异步操作期间发生错误{resultLabel.Text = "Error:"+ e.Error.Message;}else//后台操作成功{resultLabel.Text = "Done! Result = "+ e.Result;}}}
}

 运行效果

案例⑧  使用Invoke跨线程传输信息和状态

        #region ②串口数据接收事件/// <summary>/// ②串口数据接收事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件{Invoke((EventHandler)delegate  //在UI线程上执行委托,而以下代码是委托需求。{Thread.Sleep(20);if (radioButton4.Checked)//接收模式为字符模式{string str1 = serialPort1.ReadExisting();//字符串模式读textBox1.AppendText(str1 + "\r\n");}//添加内容if (radioButton2.Checked)//接收模式为数值模式{byte data = (byte)serialPort1.ReadByte();//此处需要强制类型转换,将int类型数据转换byte类型数据,不必考虑是否丢失数据string str2 = Convert.ToString(data, 16).ToUpper();//转换为大写十六进制字符串textBox1.AppendText("0x" + (str2.Length == 1 ? "0" + str2 : str2) + "\r\n");}if (radioButton6.Checked)//接收模式为中文模式{//在c#中,如果是通过串口要给下位机发送中文编码或给其他软件(如串口调试助手),则最好采用unicode编码//System.Text.UnicodeEcoding unic= new System.Text.UnicodeEcoding ();//Byte[] writeBytes = unic.GetBytes("你好世界");---接收//serialPort.Write(writeBytes, 0, writeBytes.Length);--发送UTF8Encoding utf8 = new UTF8Encoding();//创建UTF8编码对象Byte[] readBytes = new Byte[serialPort1.BytesToRead];//获取缓冲区数据的字节数serialPort1.Read(readBytes, 0, readBytes.Length);String decodedString = utf8.GetString(readBytes);//UTF8解码后转换为string类型textBox1.AppendText(decodedString + "\r\n");}});}#endregion

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

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

相关文章

【算法与数据结构】112、LeetCode路径总和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题通过计算根节点到叶子节点路径上节点的值之和&#xff0c;然后再对比目标值。利用文章【算法和数据…

C语言数值表示——进制、数值存储方式

进制 进制也就是进位制&#xff0c;是人们规定的一种进位方法对于任何一种进制—X进制&#xff0c;就表示某一位置上的数运算时是逢X进一位 十进制是逢十进一&#xff0c;十六进制是逢十六进一&#xff0c;二进制就是逢二进一&#xff0c;以此类推&#xff0c;x进制就是逢x进位…

虹科荣誉丨最佳雇主!虹科荣获2023年度最佳数智化雇主奖项

2023年度最佳数智化雇主 广州虹科电子科技有限公司 由《中国经营报》和科锐国际联合发起的“2023卓越雇主品牌”申报活动中&#xff0c;经过专业评选机构及权威媒体等选拔&#xff0c;广州虹科电子科技有限公司荣获2023年度最佳数智化雇主奖。 虹科&#xff1a;您可靠的解决方…

《动手学深度学习》-57长短期记忆网络LSTM

沐神版《动手学深度学习》学习笔记&#xff0c;记录学习过程&#xff0c;详细的内容请大家购买书籍查阅。 b站视频链接 开源教程链接 长短期记忆网络&#xff08;LSTM&#xff09; 长期以来&#xff0c;隐变量模型存在长期信息保存和短期输入缺失的问题。解决这一问题的最早…

ESP32-CAM模块Arduino环境搭建测试

ESP32-CAM模块Arduino环境搭建测试 一.ESP32OV2640摄像头模块CameraWebServer视频查看 二.测试ESP32-CAM(后续称cam模块)代码是否上传执行成功测试 const int led0 12; const int led1 13;void setup() {// put your setup code here, to run once:pinMode(led0, OUTPUT);pin…

JS小球绕着椭圆形的轨迹旋转并且近大远小

在ivx中案例如下&#xff1a; VxEditor 效果如下&#xff0c;近大远小 主要代码如下&#xff1a; const centerX 360 / 2; // 椭圆中心的X坐标 const centerY 120 / 2; // 椭圆中心的Y坐标 const a 100; // 长半轴 const b 60; // 短半轴const elementsWithClassName d…

QEMU 仿真RISC-V freeRTOS 程序

1. 安裝RISC-V 仿真環境 --QEMU 安裝包下載地址: https://www.qemu.org/ 安裝命令及安裝成功效果如下所示, target-list 設定爲riscv32-softmmu, $ cat ~/project/qemu-8.0.4/install.sh sudo apt-get install libglib2.0-dev sudo apt-get install libpixman-1-dev ./co…

设计模式之组合模式

文章目录 一、介绍二、案例 一、介绍 组合模式(Composite Pattern)&#xff0c;属于结构型设计模式。组合模式常用于树形的数据结构&#xff0c;比如&#xff1a;多级菜单、部门层级关系、html文本中的dom树。它的特点是使用户对单个对象和组合对象的使用是相同的。 二、案例…

自动化管理管理工具----Ansible

目录 ​编辑 一、Ansible概念 1.1特点 二、工作机制&#xff08;日常模块&#xff09; 2.1 核心程序 三、Ansible 环境安装部署 四、ansible 命令行模块 4.1command 模块 4.2shell 模块 4.3cron 模块 4.4user 模块 4.5group 模块 4.6copy模块 4.7file模块 4.8ho…

保护网站安全:学习蓝莲花的安装和使用,复现跨站脚本攻击漏洞及XSS接收平台

这篇文章旨在用于网络安全学习&#xff0c;请勿进行任何非法行为&#xff0c;否则后果自负。 环境准备 一、XSS基础 1、反射型XSS 攻击介绍 原理 攻击者通过向目标网站提交包含恶意脚本的请求&#xff0c;然后将该恶意脚本注入到响应页面中&#xff0c;使其他用户在查看…

Linux 通过 Docker 部署 Nacos 2.2.3 服务发现与配置中心

目录 环境准备Nacos 数据库创建Docker 部署 Nacos1. 创建挂载目录2. 下载镜像3. 创建和启动容器4. 访问控制台 导入 Nacos 配置SpringBoot 整合 Nacospom 依赖application.yml 配置 参考官方链接微服务商城源码 环境准备 名称版本IP端口Nacos2.2.3192.168.10.218848、9848MySQ…

Linux学习之Ubuntu 20使用systemd管理OpenResty服务

sudo cat /etc/issue可以看到操作系统的版本是Ubuntu 20.04.4 LTS&#xff0c;sudo lsb_release -r可以看到版本是20.04&#xff0c;sudo uname -r可以看到内核版本是5.5.19&#xff0c;sudo make -v可以看到版本是GNU Make 4.2.1。 需要先参考我的博客《Linux学习之Ubuntu 2…

Spring-SpringBoot-SpringMVC-MyBatis常见面试题

文章目录 Spring篇springbean是安全的的?什么是AOP你们工作中有用过AOP吗spring中的事务是如何实现的spring中事务失效场景Spring的生命周期spring中的循坏依赖springMVC的执行流程springboot的启动原理常用注解MyBatis执行流程Mybatis是否支持延迟加载&#xff1f;Mybatis的一…

学习创建第一个 React 项目

目标 本篇的目标是配置好基础的环境并创建出第一个 React 项目。 由于之前没接触过相关的知识&#xff0c;所以还需要了解其依赖的一些概念。 步骤主要参考First React app using create-react-app | VS code | npx | npm - YouTube 0. 简单了解相关概念 JavaScript 一种语…

Python Qt(七)Listview

源代码&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file qt_listview.ui # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not…

CLICK HOUSE

一、clickhouse简介 MPP架构的列式存储数据库&#xff08;DBMS&#xff1a;Database Management System&#xff09;&#xff0c;能够使用 SQL 查询实时生成分析数据报告。ClickHouse的全称是Click Stream&#xff0c;Data WareHouse。 ClickHouse的全称由两部分组成&#xf…

爬虫逆向实战(二十一)-- 某某点集登录与获取数据

登录 一、数据接口分析 主页地址&#xff1a;某某点集 1、抓包 通过抓包可以发现登录接口是phonePwdLogin 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有pwd和sig两个加密参数 请求头是否加密&#xff1f; 无响应是否加密&#x…

ICCV 2023 | 小鹏汽车纽约石溪:局部上下文感知主动域自适应LADA

摘要 主动域自适应&#xff08;ADA&#xff09;通过查询少量选定的目标域样本的标签&#xff0c;以帮助模型从源域迁移到目标域。查询数据的局部上下文信息非常重要&#xff0c;特别是在域间差异较大的情况下&#xff0c;然而现有的ADA方法尚未充分探索这一点。在本文中&#…

C#2010 .NET4 解析 json 字符串

下载Newtonsoft.Json.dll using System; using System.Collections.Generic; using System.Linq; using System.Text;using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; namespace ConsoleApplication1 {class Program{static void Main(string[] args){strin…