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

[简介]
常用网名: 猪头三
生日期: 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> 使用Threadnew()出一个新线程
2> 通过Start()把新线程启动起来
3> 新线程通过调用this.Invoke()->mpr_pro_UpdateText()来更新界面.

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

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

[截图]

原文地址:https://blog.csdn.net/Code_GodFather/article/details/134656156

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_22376.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注