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. 最佳实践
- 避免共享状态:优先使用局部变量
- 最小化锁范围:锁内代码尽可能简短
- 使用取消令牌:
var cts = new CancellationTokenSource(); Task.Run(() => { /* ... */ }, cts.Token); cts.Cancel(); // 请求取消任务 - 异常处理:在任务内捕获异常
Task.Run(() => { try { /* 可能出错的代码 */ } catch (Exception ex) { /* 处理异常 */ } });
7. 调试工具
- Visual Studio并行堆栈视图
ConcurrentVisualizer扩展- 日志记录关键线程事件
关键原则:优先使用高级抽象(如TPL和async/await),仅在必要时使用底层线程操作。并发设计应遵循"尽可能无锁,必要时正确加锁"的准则,平衡性能与安全性。
1270

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



