尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C# 多线程进阶知识点(线程优先级、多委托传参、线程锁、死锁)
一、线程优先级ThreadPriority1. 核心原理CPU 采用时间片轮转调度机制线程优先级不决定执行先后顺序只决定获取CPU时间片的概率、执行频率、占用时长。优先级从高到低排序Highest AboveNormal Normal默认 BelowNormal Lowest高优先级线程更容易抢到CPU资源、执行频次更高低优先级线程大概率礼让偶尔执行。2. 独立完整代码private void button1_Click(object sender, EventArgs e) { // 正常优先级 Thread t1 new Thread(ShowThreadInfo); t1.Name 线程1-Normal; t1.Priority ThreadPriority.Normal; // 最低优先级 Thread t2 new Thread(ShowThreadInfo); t2.Name 线程2-Lowest; t2.Priority ThreadPriority.Lowest; // 最高优先级 Thread t3 new Thread(ShowThreadInfo); t3.Name 线程3-Highest; t3.Priority ThreadPriority.Highest; // 低于正常优先级 Thread t4 new Thread(ShowThreadInfo); t4.Name 线程4-BelowNormal; t4.Priority ThreadPriority.BelowNormal; // 高于正常优先级 Thread t5 new Thread(ShowThreadInfo); t5.Name 线程5-AboveNormal; t5.Priority ThreadPriority.AboveNormal; // 统一启动并发抢占CPU t1.Start(); t2.Start(); t3.Start(); t4.Start(); t5.Start(); } // 线程执行方法打印线程信息 public void ShowThreadInfo() { for (int i 0; i 10000; i) { Console.WriteLine($线程名{Thread.CurrentThread.Name}ID{Thread.CurrentThread.ManagedThreadId}状态{Thread.CurrentThread.ThreadState}); } }3. 专属注意事项优先级不保证绝对先后执行只是概率倾斜低优先级线程也可能先执行默认线程优先级为 Normal日常业务无需手动修改禁止滥用最高优先级容易抢占系统资源导致系统卡顿优先级仅作用于同进程内线程无法跨进程抢占CPU二、线程传入多个委托方法多任务封装1. 核心原理利用Action委托封装多个无参无返回值的耗时任务将两个自定义方法传入同一个子线程执行实现代码复用、任务封装。子线程内顺序执行多个委托任务通过 Invoke 安全更新UI。2. 独立完整代码private void button2_Click(object sender, EventArgs e) { // 传入两个自定义耗时任务 RunTwoTask( // 任务1计算求和更新label1 () { int sum 0; for (int i 0; i 10000; i) sum i; // 跨线程安全更新UI Invoke(new Action(() label1.Text sum.ToString())); }, // 任务2计算求和更新label2 () { int sum 0; for (int i 0; i 10000; i) sum i; Invoke(new Action(() label2.Text sum.ToString())); } ); } // 封装方法接收两个委托在子线程执行 public void RunTwoTask(Action task1, Action task2) { Thread t new Thread(() { task1.Invoke(); task2.Invoke(); }); t.Start(); Console.WriteLine(主线程不阻塞直接执行完毕); }3. 专属注意事项多个委托在同一个子线程串行执行不是并发执行子线程严禁直接操作UI必须使用 Invoke 抛回主线程更新Action 委托仅支持无参无返回值方法有参数/返回值需使用 Func该写法适合批量封装耗时任务简化线程创建代码三、lock 线程锁解决多线程资源争抢1. 核心原理多线程同时操作同一个共享变量/资源时会出现数据错乱、数据覆盖问题。lock(锁对象)可以锁住代码块同一时间仅允许一个线程进入执行其他线程排队等待保证共享资源操作的原子性、安全性。2. 独立完整代码// 共享全局变量多线程争抢资源 int sum 0; // 专属锁对象必须唯一、静态、只读 readonly object lockObj new object(); private void button3_Click(object sender, EventArgs e) { // 启动两个线程同时操作sum Thread t1 new Thread(AddSum); Thread t2 new Thread(SubSum); t1.Start(); t2.Start(); } // 线程1累加操作 public void AddSum() { for (int i 0; i 10000; i) { // 锁定代码块单线程独占执行 lock (lockObj) { sum; Console.WriteLine($线程1执行sum {sum}); } } } // 线程2累加操作 public void SubSum() { for (int i 0; i 10000; i) { // 同一把锁排队执行 lock (lockObj) { sum; Console.WriteLine($线程2执行sum {sum}); } } }3. 专属注意事项锁对象必须是全局唯一不能在方法内new否则锁失效多个线程必须使用同一把锁不同锁无法互斥lock 只锁代码块不锁对象仅限制多线程进入锁范围尽量最小化避免锁过多代码导致性能卡顿、变回同步无锁数据错乱有锁数据安全、有序执行四、线程死锁成因、代码、解决方案1. 核心原理死锁成因两个或多个线程互相持有对方需要的锁资源同时互相等待对方释放锁双方僵持不释放线程永久阻塞程序卡死。经典场景线程1持有锁A等待锁B线程2持有锁B等待锁A双方无限等待代码永久卡住2. 死锁错误代码可直接复现卡死private void button4_Click(object sender, EventArgs e) { object lockA new object(); object lockB new object(); // 线程1先拿A锁再拿B锁 new Thread(() { lock (lockA) { Thread.Sleep(100); // 保证线程2先拿到B锁 lock (lockB) { Console.WriteLine(线程1执行完成); } } }).Start(); // 线程2先拿B锁再拿A锁 new Thread(() { lock (lockB) { Thread.Sleep(100); // 保证线程1先拿到A锁 lock (lockA) { Console.WriteLine(线程2执行完成); } } }).Start(); }3. 死锁最优解决方案统一锁的获取顺序所有线程获取多把锁的顺序保持一致从根源杜绝死锁。4. 修正后无死锁代码private void button4_Click(object sender, EventArgs e) { object lockA new object(); object lockB new object(); // 线程1固定顺序 先A后B new Thread(() { lock (lockA) { Thread.Sleep(100); lock (lockB) { Console.WriteLine(线程1执行完成); } } }).Start(); // 线程2和线程1保持一致 先A后B new Thread(() { lock (lockA) { Thread.Sleep(100); lock (lockB) { Console.WriteLine(线程2执行完成); } } }).Start(); }5. 专属注意事项死锁四大必要条件互斥、请求保持、不可剥夺、循环等待最简单高效的解决方式所有线程锁顺序统一禁止多线程交叉嵌套锁极易引发死锁死锁后线程永久阻塞不会自动恢复只能重启程序五、整体知识点总结一、线程优先级不控制执行顺序仅倾斜CPU时间片占用概率二、多委托传参封装多段耗时逻辑单线程串行执行安全更新UI三、lock线程锁保证共享资源原子操作解决多线程数据错乱问题四、线程死锁交叉嵌套锁导致互相等待统一锁顺序即可彻底解决
RELATED

相关推荐

Cesium 实战 36 - 地图鼠标移动事件功能

Cesium 实战 36 - 地图鼠标移动事件功能

Cesium 实战 36 - 地图鼠标移动事件功能 核心代码 1. 鼠标移动事件注册 2. 移除事件 参数说明 MOUSE_MOVE 事件对象 两种高度获取方式 完整代码 实现要点 e.position 与 e.endPosition 的区别 getHeight vs positionCartographic.height 高频事件性能 在线示例 鼠标移动事件(M…

📅 2026/9/11 18:49:49
Hyper-V与PowerShell高效管理虚拟机指南

Hyper-V与PowerShell高效管理虚拟机指南

1. Hyper-V与PowerShell管理概述在Windows环境中管理虚拟机时,图形界面操作虽然直观但效率有限。作为长期使用Hyper-V的运维人员,我发现PowerShell才是真正的高效工具。通过命令行可以批量操作虚拟机、自动化日常任务,还能实现图形界面无法完…

📅 2026/7/25 1:14:11
C++高性能IO架构:从Reactor模式到微秒级响应优化实战

C++高性能IO架构:从Reactor模式到微秒级响应优化实战

1. 项目概述:从“亿级并发”到“微秒级响应”的挑战 做后端开发的朋友,尤其是搞C的,一看到“亿级并发”和“微秒级响应”这两个词放在一起,第一反应多半是“这得是多顶级的硬件和架构?”。确实,这听起来像是…

📅 2026/7/20 1:58:06
MORE NEWS

更多资讯

📰

Excel图片批量压缩4种方案对比与优化技巧

1. 为什么需要批量压缩Excel中的图片? 在日常办公中,我们经常遇到一个头疼的问题:插入大量图片后的Excel文件体积暴增。上周我就收到同事发来的一个产品目录表,原本应该只有几百KB的数据文件,因为插入了20多张高清产品…

📰

SolidWorks镜像实体与基准面:对称建模与斜面定位核心技巧

做SW零件建模这些年,我最大的体会是:很多人图越画越多,模型树却越来越乱,很大一部分原因就是没有把“镜像实体”和“生成基准面”这两个基本功用到极致。一个对称的零件,你是一边画完再画另一边,还是画好一…

📰

高压电源选型:基于失效模式的四维分类图谱

1. 为什么一张“分类图谱”比十份参数表更有决策价值我第一次在某电力电子设备厂做现场支持时,客户工程师把三台不同品牌的高压电源模块并排摆在测试台上,指着其中一台说:“这台打火,但所有参数都标称合格。”后来发现&#xff0c…

📰

Transformers 中的 Decision Transformer:将离线强化学习重构为条件序列建模

Transformers 中的 Decision Transformer:将离线强化学习重构为条件序列建模 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal m…

📰

STM32嵌入式开发中Claude Code的工程化应用实践

1. 项目概述:当嵌入式开发遇上AI编程助手,不是替代工程师,而是重构工作流“嵌入式软件AI编程”这个标题乍看像概念炒作,但如果你最近在Keil里调了三天串口DMA收发却始终丢帧、在CubeMX生成的HAL库初始化代码里反复注释/反注释时钟…

📰

CMSIS-FreeRTOS源码审计:从适配层到内核调度的嵌入式RTOS实践

做嵌入式开发这些年,我越来越觉得有一类源码值得每个 MCU 工程师静下心来从头到尾读一遍:CMSIS-FreeRTOS。尤其是用 STM32CubeMX、Keil RTE 或 ARM 官方仓库生成过工程的朋友,你们每天打开的就是这个东西,但它内部到底怎么跑起来的…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬