C#多线程与并发设计

C#多线程与并发设计

1. 基本概念
  • 多线程:允许程序同时执行多个任务,提高CPU利用率
  • 并发:多个操作在重叠时间段内执行,需解决资源竞争问题
  • 关键挑战
    • 竞态条件(Race Conditions)
    • 死锁(Deadlocks)
    • 线程饥饿(Thread Starvation)
2. 核心实现方式
(1) Thread类(基础线程)
var thread = new Thread(() => {
    Console.WriteLine($"子线程ID: {Thread.CurrentThread.ManagedThreadId}");
});
thread.Start();
(2) 线程池(高效资源管理)
ThreadPool.QueueUserWorkItem(state => {
    Console.WriteLine($"线程池线程ID: {Thread.CurrentThread.ManagedThreadId}");
});
(3) Task Parallel Library (TPL)
Task.Run(() => {
    Console.WriteLine($"Task线程ID: {Task.CurrentId}");
});
3. 同步机制
// 锁机制示例
private static readonly object _lock = new object();
int sharedValue = 0;

void Increment() {
    lock (_lock) {
        sharedValue++;  // 线程安全操作
    }
}
同步工具适用场景
lock/Monitor临界区简单互斥访问
Mutex跨进程同步
SemaphoreSlim限制并发访问数量
ReaderWriterLock读写分离场景
4. 异步编程模型(async/await)
async Task DownloadDataAsync() {
    using var client = new HttpClient();
    string data = await client.GetStringAsync("https://api.example.com");
    Console.WriteLine($"接收数据长度: {data.Length}");
}
5. 并发集合
var concurrentDict = new ConcurrentDictionary<int, string>();
concurrentDict.TryAdd(1, "Value1");  // 线程安全操作

var blockingColl = new BlockingCollection<int>();
blockingColl.Add(42);  // 生产者-消费者模型
6. 最佳实践
  1. 避免共享状态:优先使用局部变量
  2. 最小化锁范围:锁内代码尽可能简短
  3. 使用取消令牌
    var cts = new CancellationTokenSource();
    Task.Run(() => { /* ... */ }, cts.Token);
    cts.Cancel();  // 请求取消任务
    
  4. 异常处理:在任务内捕获异常
    Task.Run(() => {
        try { /* 可能出错的代码 */ }
        catch (Exception ex) { /* 处理异常 */ }
    });
    
7. 调试工具
  • Visual Studio并行堆栈视图
  • ConcurrentVisualizer扩展
  • 日志记录关键线程事件

关键原则:优先使用高级抽象(如TPL和async/await),仅在必要时使用底层线程操作。并发设计应遵循"尽可能无锁,必要时正确加锁"的准则,平衡性能与安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值