[原创][1]探究C#多线程开发细节-“Thread类的简单使用“

[简介]
常用网名: 猪头三
出生日期: 1981.XX.XX
QQ: 643439947
个人网站: 80x86汇编小站 https://www.x86asm.org
编程生涯: 2001年~至今[共22年]
职业生涯: 20年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测


[序言]
随着.NET 8和C# 12的同时发布, 让我意识到, 是时候要更新自身陈旧的C#语言基础了. 目前先定下一个小目标: 完成C#下的多线程开发新技术的学习. 因此就有该系列文章. 对于编程经验的人来说, 优先巩固多线程的相关新知识点是最好的选择.


[首先要明白一个重要理论: 后台线程与UI线程是2个不同线程, 要让它们两者之间能顺利的进行数据交互, 需要遵守编程规范]
(这个重要的理论是贯穿该系列文章的, 所以优先在这里说明) Windows操作系统中的UI元素(例如在WinForms或WPF应用程序中的窗体、按钮、文本框等)是由UI线程负责管理和更新的. 这个UI线程也被称为消息循环线程或主线程, 它负责处理用户交互、绘制界面以及响应操作系统发送的消息等任务. 如果有其它后台线程(非UI的)直接访问或更新UI元素可能导致潜在的线程安全问题和不可预测的行为,比如会触发线程冲突和跨线程访问UI的异常. 这是因为后台线程(非UI的)和UI线程是相互独立的, 不能随便跨越访问. 为了解决这个问题, 如果用C#编写多线程的话, 自带的线程库本身都会提供安全的方法让开发者进行调用. 从而解决后台线程与UI线程交互的问题.


[正式开启C#版本的最简单的多线程开发]
1> 启动Visual Studio Enterprise 2022版本
2> 建立一个C# Windows窗体应用(.NET Framework). 
3> 模仿下面的代码, 抄写到你建立的项目中

    public partial class Form_Main : Form{public Form_Main(){InitializeComponent();}private void mpr_pro_UpdateText(string str_param_Text){// 在界面上显示线程运行信息lb_ShowInfo.Text = str_param_Text;}private void Bn_StartThread_Click(object sender, EventArgs e){// 启动一个新线程Thread class_NewThread = new Thread(() =>{// 切换至UI线程(界面线程)上更新文本框this.Invoke((MethodInvoker)delegate {mpr_pro_UpdateText("Hello World 线程已启动并进入工作状态...");});// 用休眠函数, 模拟一些耗时操作Thread.Sleep(3000);// 切换至UI线程(界面线程)上更新文本框this.Invoke((MethodInvoker)delegate {mpr_pro_UpdateText("Hello World 线程运行完毕.");});});class_NewThread.Start();}}

代码解释: 窗体上有一个按钮, 然后单击按钮之后, 会创建的一个线程class_NewThread, 该线程启动并运行时, 会先休眠1秒钟, 然后调用this.Invoke方法处理界面更新的问题. 作用就是: 在界面显示一个字符"Hello World 线程已经启动."

[重要的核心理解]
1> 使用Thread类new()出一个新线程
2> 通过Start()把新线程启动起来
3> 新线程通过调用this.Invoke()->mpr_pro_UpdateText()来更新界面.


[针对this.Invoke()重点理解]
Invoke()方法允许你将更新UI元素的操作委托给UI线程去执行, 它通过在UI线程上执行特定的委托或方法来确保在正确的线程上下文中更新UI元素. 这种机制实际上是把将要执行的操作加入到UI线程的消息队列中, 然后由UI线程按照队列的顺序执行来实现的. 这样可以避免直接从后台线程(非UI的)访问UI元素所带来的潜在问题并确保安全地更新界面数据.


[总结]
可能很多人看到这篇文章感觉很简单, 其实代码有很多细节, 需要慢慢理解, 比如(MethodInvoker)delegate是什么?^_^, 后面的文章会更复杂, 请做好心里准备.

[截图]

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

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

相关文章

部署Jenkins

一、介绍 Jenkins 、Jenkins概念 Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台。这是一个免费的源代码,可以处理任何类型的构建或持续集成。集成Jenkins可以用于一些测试和部署技术。Jenkins是一种软件允…

01-鸿蒙4.0学习之开发环境搭建 HelloWorld

HarmonyOS开发学习 1.环境配置 1.下载地址 开发工具:DevEco Studio 3.1.1 Release 下载地址 安装选择快捷方式 安装nodejs和Ohpm 安装SDK 选择同意Accept 检测8项目是否安装成功 2.创建项目 —— hello word

用python实现kindle文件转换pdf

上一篇文章讲了下用工具转换相关的格式:https://blog.csdn.net/weixin_42019349/article/details/134654695 今天来分享一个python库实现上述功能,实现文件转换自由 ^_^ 主角就是pypandoc库 # 安装方式 pip install pypandoc# pypandoc主要有三个函数…

【高效开发工具系列】MapStruct入门使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

web:[NPUCTF2020]ReadlezPHP

题目 打开页面显示如下 没发现其他的线索,查看源代码 发现一个网址,访问这个页面查看 进行代码审计 这段代码是一个简单的 PHP 类,名为 HelloPhp。它有两个公共属性 $a 和 $b,并在构造函数中将它们分别初始化为字符串 "Y-m-…

每日一题--寻找重复数

蝶恋花-王国维 阅尽天涯离别苦, 不道归来,零落花如许。 花底相看无一语,绿窗春与天俱莫。 待把相思灯下诉, 一缕新欢,旧恨千千缕。 最是人间留不住,朱颜辞镜花辞树。 目录 题目描述: 思路分析…

IDEA中也能用postman了?

Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还…

如何将mobi、awz3、epub格式转化为pdf

偶然之间有个需求就是网上下载了一些书籍的格式没法打开看,或者是想把kindle的书籍转换成pdf 那么经过一番折腾找到了两个可以用的工具站分享给大家,有需要的可是尝试下,小编这边测试了可以用,就是下载的时候慢的一匹。。。 第一…

Mac 搭建本地服务器

文章目录 1 启动服务器2 服务器目录3 手机访问服务器3.1 手机和电脑连上同一个局域网( 或WIFI)3.2 找到电脑的ip地址 如下图所示3.3 手机打开 http://192.168.10.5/1.txt 4 关闭服务器5 参考文章 1 启动服务器 sudo apachectl start启动后访问 http://localhost/ 如下图所示即…

每日一题:LeetCode-202.快乐数(一点都不快乐)

每日一题系列(day 06) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50e…

力扣6:N字形变化

代码&#xff1a; class Solution { public:string convert(string s, int numRows){int lens.size();if(numRows1){return s;}int d2*numRows-2;int count0;string ret;//第一行&#xff01;for(int i0;i<len;id){rets[i];}//第k行&#xff01;for(int i1;i<numRows-1;…

SpringBoot——国际化

优质博文&#xff1a;IT-BLOG-CN 一、Spring 编写国际化时的步骤 【1】编写国际化配置文件&#xff1b; 【2】使用ResourceBundleMessageSource管理国际化资源文件&#xff1b; 【3】在页面使用ftp:message取出国际化内容&#xff1b; 二、SpringBoot编写国际化步骤 【1】创…