在 C# 中,线程和多线程编程涉及大量关键字、类和方法。以下是完整的线程相关关键词、方法及核心类的分类总结:
一、线程管理
1. **Thread
类(System.Threading
)**
- 核心方法:
Start()
:启动线程。Join()
:等待线程结束。Sleep(int milliseconds)
:暂停当前线程。Interrupt()
:中断处于Sleep
/Wait
状态的线程。Abort()
(已过时):强制终止线程(不推荐)。
- 属性:
IsBackground
:设置线程是否为后台线程(默认前台)。Priority
:线程优先级(Highest
,Normal
,Lowest
等)。Name
:线程名称(调试用)。CurrentThread
:获取当前线程对象。
csharp
Thread thread = new Thread(() => Console.WriteLine("子线程"));
thread.IsBackground = true;
thread.Start();
thread.Join();
2. **ThreadPool
类(System.Threading
)**
- 用途:复用线程池中的线程(适合短任务)。
- 方法:
QueueUserWorkItem()
:提交任务到线程池。SetMinThreads()
/SetMaxThreads()
:配置线程池大小。
csharp
ThreadPool.QueueUserWorkItem(state => {
Console.WriteLine("线程池任务");
});
二、任务并行库(TPL)
1. **Task
类(System.Threading.Tasks
)**
- 核心方法:
Run()
:启动一个线程池任务。Wait()
:等待任务完成。ContinueWith()
:定义任务完成后的回调。
- 属性:
Status
:任务状态(RanToCompletion
,Faulted
等)。Exception
:任务抛出的异常(需检查IsFaulted
)。
csharp
Task task = Task.Run(() => {
Console.WriteLine("Task 执行");
});
task.Wait();
2. **async
/await
关键字**
- 用途:简化异步编程模型。
- 规则:
async
修饰的方法必须返回Task
或Task<T>
。await
等待异步操作完成。
csharp
async Task<int> GetDataAsync() {
await Task.Delay(1000);
return 42;
}
三、同步机制
1. **lock
关键字**
- 语法:
lock (obj) { ... }
(obj
必须是引用类型)。
csharp
private object _locker = new object();
lock (_locker) {
// 临界区
}
2. **Monitor
类**
- 方法:
Enter(obj)
/Exit(obj)
:手动控制锁。TryEnter(obj, timeout)
:尝试获取锁。
csharp
Monitor.Enter(_locker);
try {
// 临界区
} finally {
Monitor.Exit(_locker);
}
3. **Mutex
类(跨进程同步)**
- 方法:
WaitOne()
:获取锁。ReleaseMutex()
:释放锁。
csharp
using var mutex = new Mutex(true, "GlobalMutex");
mutex.WaitOne();
// 临界区
mutex.ReleaseMutex();
4. **Semaphore
/SemaphoreSlim
**
- 用途:限制并发访问数量。
csharp
SemaphoreSlim semaphore = new SemaphoreSlim(3);
semaphore.Wait();
// 临界区(最多3个线程)
semaphore.Release();
5. **Interlocked
类**
- 原子操作:
Increment(ref int)
:原子递增。CompareExchange(ref T, T, T)
:原子比较并交换。
csharp
int counter = 0;
Interlocked.Increment(ref counter);
6. **ReaderWriterLockSlim
**
- 用途:读写分离锁(允许多读单写)。
csharp
ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
rwLock.EnterReadLock();
// 读操作
rwLock.ExitReadLock();
四、取消机制
1. **CancellationTokenSource
和 CancellationToken
**
- 方法:
Cancel()
:触发取消请求。CancelAfter(timeout)
:超时自动取消。
csharp
var cts = new CancellationTokenSource();
var token = cts.Token;
Task.Run(() => {
while (true) {
token.ThrowIfCancellationRequested();
// 任务逻辑
}
}, token);
cts.Cancel(); // 取消任务
五、并行循环
1. **Parallel
类(System.Threading.Tasks
)**
- 方法:
For()
:并行循环。ForEach()
:并行遍历集合。Invoke()
:并行执行多个委托。
csharp
Parallel.For(0, 10, i => {
Console.WriteLine($"并行执行 {i}");
});
六、线程安全集合
1. **ConcurrentBag<T>
、ConcurrentQueue<T>
、ConcurrentStack<T>
**
- 用途:无需锁的线程安全集合。
csharp
ConcurrentBag<int> bag = new ConcurrentBag<int>();
bag.Add(42);
2. **BlockingCollection<T>
**
- 用途:生产者-消费者模型。
csharp
BlockingCollection<int> queue = new BlockingCollection<int>();
// 生产者
queue.Add(1);
// 消费者
int item = queue.Take();
七、其他关键特性
1. **volatile
关键字**
- 用途:确保字段的可见性(禁止编译器优化)。
csharp
private volatile bool _isRunning = true;
2. **ThreadLocal<T>
和 [ThreadStatic]
**
- 用途:线程本地存储(每个线程独立副本)。
csharp
[ThreadStatic]
private static int _threadLocalValue;
ThreadLocal<int> threadLocal = new ThreadLocal<int>(() => 42);
3. **Barrier
和 CountdownEvent
**
- 用途:多线程协同(例如分阶段任务)。
csharp
Barrier barrier = new Barrier(3); // 等待3个线程到达
barrier.SignalAndWait();
八、不推荐使用的功能
- **
Thread.Suspend()
/Resume()
**- 已过时,可能导致死锁或状态不一致。
- **
Thread.Abort()
**- 强制终止线程,可能引发资源泄漏。
总结
- 优先选择 TPL(
Task
和async/await
):简化异步编程,避免直接操作线程。 - 同步机制:根据场景选择
lock
、Semaphore
、Mutex
或Interlocked
。 - 线程安全集合:替代手动同步,提升性能。
- 取消机制:使用
CancellationToken
实现协作式取消。
合理使用这些工具可以高效处理并发任务,同时避免死锁、竞态条件等常见问题。