<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[m0_57417006的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/m0_57417006</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; m0_57417006]]></copyright><item><title><![CDATA[Halcon 学习笔记 #001：读图与显示]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/163211981</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/163211981</guid><author>m0_57417006</author><pubDate>Sun, 26 Jul 2026 12:25:16 +0800</pubDate><description><![CDATA[💡 在 HDevelop 的 "变量"窗口（一般在界面右下角）里，运行完这一行后你会看到 `Width` 和 `Height` 自动出现了，并且显示了具体的数值。⚠️ 常见坑：很多从 OpenCV 过来的开发者习惯 `(x, y)` = `(列, 行)` 的写法，但 Halcon 是 `(Row, Column)` = `(行, 列)`，顺序反的，一开始很容易搞混。放在 `dev_open_window` 和 `dev_set_part` 之后执行，这样窗口已经准备好了，图片就能正确显示了。]]></description><category></category></item><item><title><![CDATA[.NET 线程池 工作线程 扩容 + 空闲 + 回收 原理]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160946931</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160946931</guid><author>m0_57417006</author><pubDate>Sun, 10 May 2026 10:46:01 +0800</pubDate><description><![CDATA[本文详细解析了.NET线程池的工作机制，主要包含三个核心规则：1）扩容逻辑：任务到达时若线程数小于最小值（默认CPU核心数）立即创建线程，超过后每500ms限流创建1个线程；2）空闲处理：执行完任务的线程进入休眠等待状态，不占用CPU；3）回收机制：超过最小值的线程空闲1秒后销毁，最小值以内的线程永久保留。通过代码示例展示了线程池的扩容限流（500ms/线程）和空闲回收（1秒超时）现象，并提供了完整流程图说明任务处理的生命周期。这种机制既保证了响应速度，又避免了资源浪费。]]></description><category></category></item><item><title><![CDATA[C# foreach 为什么不能增删、迭代器底层原理、版本号机制、以及所有能遍历中增删的方案]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160942380</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160942380</guid><author>m0_57417006</author><pubDate>Sun, 10 May 2026 09:08:35 +0800</pubDate><description><![CDATA[foreach循环本质会被编译器转换为迭代器模式，通过版本号机制确保集合遍历期间不被修改。List内部维护_version字段，任何结构性修改都会使其自增。迭代器初始化时会保存当前版本号，每次MoveNext()都会校验版本一致性，若发现不一致则抛出异常。这种设计是为了避免遍历过程中的漏项、重复或指针失效问题。文章介绍了6种安全修改集合的方法：for倒序遍历、先标记后删除、RemoveAll方法、复制集合快照、使用并发集合以及LinkedList链表操作。其中for倒序和RemoveAll是性能最优的方案。]]></description><category></category></item><item><title><![CDATA[C# UI 跨线程刷新：Invoke/BeginInvoke 原理与封装]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160869179</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160869179</guid><author>m0_57417006</author><pubDate>Thu, 07 May 2026 23:07:42 +0800</pubDate><description><![CDATA[摘要：WinForm/WPF中UI控件只能由UI线程操作，子线程直接修改会抛出跨线程异常。解决方法是通过Invoke/BeginInvoke将UI更新任务交给UI线程执行。Invoke是同步调用会阻塞子线程，BeginInvoke是异步调用不阻塞。WPF中使用Dispatcher实现相同功能。文章提供了封装类简化调用流程，推荐使用BeginInvoke异步方式，并给出封装代码示例。核心原则是：UI操作必须由UI线程执行，通过消息调度机制实现线程安全更新。]]></description><category></category></item><item><title><![CDATA[Task、async/await 不是多线程，是状态机语法糖]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160788162</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160788162</guid><author>m0_57417006</author><pubDate>Tue, 05 May 2026 15:13:40 +0800</pubDate><description><![CDATA[本文解析了C#中async/await的本质，指出它并非多线程技术，而是编译器生成的异步状态机语法糖。编译器将async方法拆分为多个步骤，通过IAsyncStateMachine实现暂停和恢复功能。Task只是异步任务的容器，不代表线程。文章强调异步与多线程的核心区别：异步通过挂起等待实现线程复用，而多线程是并行执行。只有在使用Task.Run时才会创建新线程，而原生异步操作如IO操作通常不占用线程。总结认为async/await是执行模式，多线程是资源调度模式，二者本质不同。]]></description><category></category></item><item><title><![CDATA[C# 反射、特性、AOP 本质原理]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160784258</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160784258</guid><author>m0_57417006</author><pubDate>Tue, 05 May 2026 10:22:43 +0800</pubDate><description><![CDATA[本文解析C#三大核心技术特性：特性(Attribute)、反射(Reflection)和AOP的递进关系。特性是为代码添加标记的语法，编译后存入元数据；反射是运行时读取这些元数据并动态操作类型的能力；AOP则基于反射和动态代理，通过拦截标记特性实现方法调用的横切逻辑处理。三者形成完整技术链：特性提供标记，反射读取标记，AOP利用反射实现动态代理和横切编程。这构成了C#框架(如ASP.NET Core)的核心支柱，支撑了ORM、IOC等高级功能的实现。]]></description><category></category></item><item><title><![CDATA[C# 泛型：约束、协变逆变、底层模板生成机制]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160771087</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160771087</guid><author>m0_57417006</author><pubDate>Mon, 04 May 2026 22:57:56 +0800</pubDate><description><![CDATA[本文系统介绍了C#泛型的核心概念与应用。首先阐述了泛型的基础特性：通过延迟类型指定实现代码复用，确保类型安全并避免装箱拆箱。其次详细解析了泛型约束（where）的五种形式及其组合使用，包括基类、接口、引用类型等约束。重点讲解了协变(out)和逆变(in)机制，说明它们如何通过子父类转换实现类型兼容性。最后揭示了CLR底层的实现原理：引用类型共享代码而值类型独立生成，解释了泛型在性能和内存上的优势。全文从语法到原理层层深入，完整呈现了泛型编程的核心技术体系。]]></description><category></category></item><item><title><![CDATA[C# 程序集、IL、CLR 执行流程]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160768299</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160768299</guid><author>m0_57417006</author><pubDate>Mon, 04 May 2026 16:05:02 +0800</pubDate><description><![CDATA[《C#程序运行机制解析》摘要： 本文系统讲解了C#程序的运行原理。C#代码首先被编译为IL中间语言和元数据，打包成程序集（.exe/.dll）。运行时CLR加载程序集，通过JIT编译器将IL代码即时编译为机器码执行。核心机制包括：1）程序集包含IL代码而非机器码；2）CLR作为运行时环境负责内存管理和安全检查；3）JIT编译器实现首次编译缓存优化。这种架构保证了.NET程序的跨平台性，所有语言最终都转换为统一的IL代码，由CLR统一管理执行。整个过程展现了从源代码到机器码的完整转换链条。]]></description><category></category></item><item><title><![CDATA[C# 继承、多态、虚方法表（VTable）原理]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160761445</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160761445</guid><author>m0_57417006</author><pubDate>Mon, 04 May 2026 11:41:54 +0800</pubDate><description><![CDATA[摘要：继承允许子类复用父类成员并重写方法，多态通过父类引用调用子类实现。C#使用虚方法表(VTable)实现多态：每个类拥有独立VTable，子类复制父类VTable并替换重写方法地址。当父类引用调用虚方法时，CLR通过对象类型指针查找VTable，动态执行子类方法。virtual和override是关键，而new不参与多态。VTable机制确保运行时根据实际对象类型调用正确方法，这是多态的核心实现原理。]]></description><category></category></item><item><title><![CDATA[C# 结构体 (struct) vs 类 (class) 本质区别 + 栈 / 堆分配 ]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160747754</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160747754</guid><author>m0_57417006</author><pubDate>Mon, 04 May 2026 00:09:58 +0800</pubDate><description><![CDATA[C#中struct和class的核心区别：struct是值类型，默认栈分配（局部变量在栈，作为字段/数组元素时内嵌到堆）；class是引用类型，实例始终在堆上。struct通过值拷贝创建独立副本，class通过引用共享对象。struct适合小数据、高频分配场景（如坐标、配置），可避免GC开销；class适合复杂业务、需要继承多态的场景。注意struct赋值给object或接口时会触发装箱操作，导致堆分配和GC开销。选择时应根据数据大小、生命周期和业务需求决定使用struct还是class。]]></description><category></category></item><item><title><![CDATA[C# 字符串不可变性 + 字符串驻留池原理]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160743547</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160743547</guid><author>m0_57417006</author><pubDate>Sun, 03 May 2026 18:43:54 +0800</pubDate><description><![CDATA[本文探讨C#字符串的两个核心特性：不可变性和驻留池机制。字符串不可变性指字符串创建后不能被修改，任何&quot;修改&quot;操作都会创建新对象，这保证了线程安全但可能导致频繁拼接时性能问题（建议使用StringBuilder）。字符串驻留池是CLR维护的全局缓存池，存储相同内容的单个实例，分为编译期自动驻留（字面量）和运行期手动驻留（string.Intern()）。两者协同工作：不可变性确保驻留池安全复用内存，驻留池则优化内存使用。需注意动态拼接字符串默认不驻留，而驻留池中的字符串生命周期较长。]]></description><category></category></item><item><title><![CDATA[C# 变量：生命周期、作用域、变量逃逸]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160743019</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160743019</guid><author>m0_57417006</author><pubDate>Sun, 03 May 2026 17:43:38 +0800</pubDate><description><![CDATA[变量本来应该在栈上，但是因为被 “外部引用”，被迫跑到堆上，无法在栈上自动释放→ 这就叫逃逸。逃逸 = 局部变量逃离了它的局部作用域，生命周期被延长了。作用域：变量能被访问的代码范围生命周期：变量在内存中存活的时间变量逃逸：局部变量被迫从栈跑到堆，生命周期被延长逃逸危害：增加 GC 压力，降低性能核心优化：尽量让局部变量不逃逸，留在栈上。]]></description><category></category></item><item><title><![CDATA[C# 装箱、拆箱 底层原理]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160730028</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160730028</guid><author>m0_57417006</author><pubDate>Sun, 03 May 2026 10:12:03 +0800</pubDate><description><![CDATA[装箱：值类型 → 引用类型，堆分配 + 数据拷贝拆箱：引用类型 → 值类型，类型检查 + 数据拷贝回栈成本：装箱 > 拆箱 > 普通赋值优化：用泛型、避免转 object、避免频繁字符串拼接。]]></description><category></category></item><item><title><![CDATA[栈和堆的概念]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160709803</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160709803</guid><author>m0_57417006</author><pubDate>Sat, 02 May 2026 11:52:21 +0800</pubDate><description><![CDATA[值类型放栈上，用完自动亡；引用地址蹲栈上，对象本体住堆仓。一句话  栈就是临时工作台，方法用完就扔，自动清理。字符串、Person 对象的所有数据。栈上：s1、p 只存。]]></description><category></category></item><item><title><![CDATA[C# 值类型 / 引用类型 内存布局（栈、堆、托管堆）]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160704859</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160704859</guid><author>m0_57417006</author><pubDate>Sat, 02 May 2026 11:39:45 +0800</pubDate><description><![CDATA[栈 = 快、自动释放、存值类型 / 引用指针托管堆 = 慢、GC 管理、存引用类型真实数据值类型 = 数据自己存自己引用类型 = 栈存地址，堆存数据class 里的值类型 → 存在堆上。]]></description><category></category></item><item><title><![CDATA[C#ManualResetEvent]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160382510</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160382510</guid><author>m0_57417006</author><pubDate>Tue, 21 Apr 2026 22:28:19 +0800</pubDate><description><![CDATA[ManualResetEvent = 手动闸门WaitOne()= 等开门Set()= 开门（一直开）Reset()= 手动关门一次打开，所有线程全部通过，必须手动重置才会重新等待适合：多线程统一启动、暂停继续、服务启动等待完整示例：多线程统一放行// 初始：关闭闸门（无信号，WaitOne 会阻塞）Console.WriteLine("=== 启动5个工作线程，全部进入等待 ===");// 开启5个子线程i <= 5;i++)]]></description><category></category></item><item><title><![CDATA[WPF 从零实现 MVVM 模式：手把手搭建待办事项应用]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/160232341</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/160232341</guid><author>m0_57417006</author><pubDate>Fri, 17 Apr 2026 07:22:47 +0800</pubDate><description><![CDATA[MVVM 是的缩写，是专门为 WPF/UWP 设计的解耦型架构模式分离界面（View）和业务逻辑（ViewModel）界面不直接操作数据，数据不依赖界面，实现低耦合、可测试、易维护彻底解耦：界面和逻辑分离，修改界面不影响逻辑，修改逻辑不影响界面可测试性：ViewModel 纯逻辑，无界面依赖，可直接写单元测试代码复用：Model、ViewModel 可跨项目、跨页面复用维护性高：职责清晰，找 bug、改功能一目了然符合 WPF 设计理念：原生支持数据绑定、命令绑定，开发效率极高。]]></description><category></category></item><item><title><![CDATA[欧姆龙 FINS 协议详解与 C# 实现]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/159394180</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/159394180</guid><author>m0_57417006</author><pubDate>Wed, 25 Mar 2026 11:09:16 +0800</pubDate><description><![CDATA[FINS（Factory Interface Network Service）是欧姆龙（OMRON）专为工业自动化领域设计的现场总线通信协议，用于实现 PLC 之间、PLC 与上位机之间的跨网络数据交互，支持位 / 字数据的读写、强制操作、参数配置等核心功能，是欧姆龙工业通信的核心协议。FINS 协议核心：基于请求 - 响应模型，FINS/TCP 是工程主流实现，需先完成 TCP 连接和 FINS/TCP 握手，再交互指令帧；编码关键。]]></description><category></category></item><item><title><![CDATA[MQTT 概念详解与 C# 实战]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/158284948</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/158284948</guid><author>m0_57417006</author><pubDate>Sun, 22 Feb 2026 16:22:12 +0800</pubDate><description><![CDATA[MQTT（Message Queuing Telemetry Transport）是一种轻量级、基于发布 / 订阅模式的物联网通信协议，由 IBM 开发，专为低带宽、高延迟、不可靠网络设计（如物联网设备、传感器、移动网络）。轻量级：协议头最小仅 2 字节，占用资源极少发布 / 订阅模式：解耦消息发送者（发布者）和接收者（订阅者）QoS 消息质量：支持 3 级消息可靠性保障持久会话：客户端断开后可恢复会话，避免消息丢失遗嘱消息：客户端异常断开时，代理自动发送预设消息MQTT 核心。]]></description><category></category></item><item><title><![CDATA[计算机网络知识（一）]]></title><link>https://blog.youkuaiyun.com/m0_57417006/article/details/157774249</link><guid>https://blog.youkuaiyun.com/m0_57417006/article/details/157774249</guid><author>m0_57417006</author><pubDate>Thu, 05 Feb 2026 21:59:38 +0800</pubDate><description><![CDATA[1-19 试解释以下名词：协议栈、实体、对等层、协议数据单元、服务访问点、客户、服务器、客户 - 服务器方式。：实现硬件、软件、数据等资源的共享，如共享打印机、云存储、分布式计算等。：使网络中任意主机之间可以交换信息，实现数据互通，如文件传输、远程登录、视频通话等。]]></description><category></category></item></channel></rss>