C# 多线程 & 异步编程知识体系整理
一、基础概念
1.1 线程(Thread)
- 定义
▸ 操作系统独立运行的最小单位,程序中并发执行的指令序列
▸ 隶属于进程,共享进程资源(内存、文件句柄等)
▸ 每个进程至少包含一个主线程
1.2 多线程意义
- 适用场景
▸ 批量重复任务并行处理(如数组元素耗时操作)
▸ 多任务独立运行(后台轮询、实时监控等)
1.3 线程池(ThreadPool)
- 核心特性
▸ 预创建可复用线程集合
▸ 减少线程创建/销毁开销
▸ 异步操作默认使用线程池
1.4 线程安全
- 关键机制
- 同步机制:协调线程执行顺序(锁/Monitor/Semaphore) - 原子操作:不可中断的指令单元(Interlocked类)
二、线程操作详解
2.1 线程生命周期
| 操作类型 | 方法/特性 | 注意事项 |
|---|---|---|
| 创建 | new Thread(ThreadStart) + Start() | 可配置后台线程/优先级 |
| 终止 | ▶ Join():阻塞等待结束▶ Interrupt():抛出ThreadInterruptedException | 禁用Abort()(引发平台异常) |
| 挂起/恢复 | ▶ 旧版Suspend()/Resume()已废弃▶ 改用信号量/锁机制 | 避免不可控状态切换 |
2.2 并发控制工具
- 传统锁机制
lock (obj) { ... } // 语法糖→Monitor.Enter/Exit Mutex.WaitOne()/ReleaseMutex() // 跨进程锁 - 轻量级同步
▸SemaphoreSlim(异步友好)
▸ManualResetEventSlim(状态标记)
三、异步编程核心
3.1 异步范式
- Task核心模型
- 状态容器:运行中/完成/结果/异常 - ValueTask:值类型优化版本 - 默认使用线程池,不阻塞调用线程 - 方法声明
▸ 避免async Task<T> GetDataAsync() { await Task.Delay(100); return default; }async void(无法捕获异常)
3.2 异步控制流
- 取消机制
var cts = new CancellationTokenSource(); await Task.Run(() => { cts.Token.ThrowIfCancellationRequested(); }, cts.Token); - 超时处理
// .NET 6+ 方案 await httpClient.GetAsync(url).WaitAsync(TimeSpan.FromSeconds(30));
四、同步机制与并发控制
4.1 线程安全组件
- 内置工具库
1. 并发集合:ConcurrentQueue/ConcurrentDictionary 2. 阻塞集合:BlockingCollection(生产者-消费者模式) 3. 通道:Channel<T>(高性能数据管道)
4.2 异步锁策略
- 推荐方案
// 使用SemaphoreSlim实现异步锁 private readonly SemaphoreSlim _semaphore = new(1, 1); async Task CriticalSectionAsync() { await _semaphore.WaitAsync(); try { /* 操作共享资源 */ } finally { _semaphore.Release(); } }
五、常见误区解析
5.1 认知澄清
| 误区描述 | 正解 |
|---|---|
| “异步等于多线程” | 单线程也可异步(如JS事件循环) |
| “Task.Result总会阻塞” | 已完成的任务可直接获取结果 |
| “await必定切换线程” | 若任务已完则延续在原线程执行(ConfigureAwait配置) |
5.2 开发禁忌
- ▸ 禁止在异步方法中使用
Thread.Sleep - ▸ 避免混用
Task.Wait()与async/await - ▸ 异步方法必须包含
CancellationToken参数
六、扩展工具与模式
- 周期性任务:`PeriodicTimer`(.NET 6+)
- 异步流处理:`IAsyncEnumerable<T>`
- 资源回收:`IAsyncDisposable`接口
- 第三方库:
▶ Nito.AsyncEx(AsyncLock)
▶ Microsoft.VisualStudio.Threading(AsyncManualResetEvent)
附录:核心API速查表
| 类别 | 关键API |
|---|---|
| 并行计算 | Parallel.For/ForEach + PLINQ.AsParallel() |
| 任务控制 | Task.WhenAll/WhenAny + TaskCompletionSource |
| 原子操作 | Interlocked.Increment/CompareExchange |
| 时间控制 | Task.Delay(异步) vs Thread.Sleep(同步) |

1389

被折叠的 条评论
为什么被折叠?



