C# 多线程 & 异步编程知识体系整理

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(高性能数据管道)
    

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`
- 资源回收:`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(同步)

你可能感兴趣的:(c#)