C# 428 线程、异步

Invoke 、beginInvoke

Invoke 和 BeginInvoke 底层都是往 UI 主线程的消息队列投递任务因为子线程不能直接操作控件。

Invoke 是同步:子线程把任务丢给主线程后,原地等待,直到主线程执行完,子线程才继续走;

BeginInvoke 是异步:子线程把任务丢给主线程后,不用等、直接放行,继续干自己的活;

本质就是:Invoke 阻塞等结果,BeginInvoke 发完就走。

线程与异步

线程是操作系统的执行单元,负责真正执行代码,可以并行处理任务;

异步是一种不阻塞的编程模式,主要用于 IO 操作(串口、网络、文件),

目的是不卡界面、不浪费线程资源。

简单说:线程是干活的人,异步是不傻等的工作方式。

SOLID 六大设计原则

单一职责:一个类只干一件事,别啥活都堆一起。

开闭原则:对扩展开放,对修改关闭。加功能尽量新增代码,少改老代码。

里氏替换:子类能完全替换父类,不报错、不异常。

依赖倒置:依赖抽象,不依赖具体类,解耦好维护。

接口隔离:接口拆小一点,别搞大而全,不用的方法别强迫实现。

迪米特法则:最少知道原则,类和类之间少耦合,少直接调用。

设计模式

单例模式

一个类全局只有一个实例,比如日志、配置管理器,全局共用。

工厂模式

统一造对象,不用 new 到处乱写,方便后期改类型。

观察者模式

一方发通知,多方自动接收,WPF 事件、数据绑定都是这个思想。

策略模式

不同算法分开写,切换规则不用改主逻辑,灵活替换。

Task & 多线程

Thread 是底层线程,太重、难管理;

Task 是线程池封装,更轻量,自带取消、等待、异常处理;

核心重点:WPF 里子线程不能直接改 UI,必须用 Dispatcher 切回 UI 线程操作,防止崩溃卡死

Thread (原生线程)

操作系统原生线程,重量大、开销高

手动新建、手动销毁,没人管理

没法灵活取消、等待、回调,写起来麻烦

开多了会资源爆炸

Task(现代异步线程)

是线程池的封装,轻量、复用线程

自带:等待执行、取消令牌CancellationToken、异常捕获、回调

语法简洁,支持 async/await

WPF / 工控开发首选,不会乱开线程浪费资源

Lambda + 闭包

Lambda:简化匿名方法,简写代码,写回调、委托超级方便。

闭包:方法里面捕获外面的变量;

坑:循环里用闭包容易变量取值错乱,要注意变量捕获问题。

数据结构

红黑树

自平衡的二叉搜索树,防止树长歪,保证查询、增删速度稳定。

自带变色、旋转规则维持平衡

C# 里 Dictionary、Java HashMap 底层都是红黑树

优点:不管数据怎么加,性能不会崩

B + 树(数据库专属)

数据库索引专用树,所有数据都存在叶子节点。

非叶子节点只存索引、用来指路

叶子节点连成链表,范围查询、分页巨快

对比红黑树:适合海量数据、磁盘存储(MySQL 默认 B + 树)

最简区分

红黑树:内存里用,查单个数据快

B + 树:硬盘数据库用,查一批数据、范围查找强

相关推荐
鬼手点金13 小时前
Scrapy + Playwright 完整示例(JS 动态渲染网页)
开发语言·javascript·爬虫·python·scrapy·html·json
Mr. zhihao13 小时前
深度解析:为什么Java序列化需要搭配ByteArrayOutputStream?IO装饰器模式的精妙设计
java·开发语言·装饰器模式
格林威14 小时前
多相机并行采图最佳实践:Task.WhenAll + 异常处理 + 资源释放
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·机器视觉
djjjx.14 小时前
【 C++ 】多态
开发语言·c++·多态
夜雪一千14 小时前
Python如何使用XPath定位没有特征的元素?无id、无class通用定位技巧
开发语言·python
艾莉丝努力练剑14 小时前
【QT:解决问题】Qt5Core.dll:无法定位程序输入点
java·开发语言·qt·学习·面试
流浪00114 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·python
光影少年14 小时前
react离线缓存、图片缓存方案
开发语言·前端·javascript·react native·react.js·缓存·前端框架
SomeB1oody14 小时前
【RustyML入门】3.7. 循环层
开发语言·后端·机器学习·rust·教程
言乐617 小时前
Python游戏水平测试辅助系统
开发语言·python·游戏·django·pygame