线程相关关键词、方法及核心类的分类总结(C#)

在 C# 中,线程和多线程编程涉及大量关键字、类和方法。以下是完整的线程相关关键词、方法及核心类的分类总结:


一、线程管理

1. ​**Thread 类(System.Threading)​**
  • 核心方法
    • Start():启动线程。
    • Join():等待线程结束。
    • Sleep(int milliseconds):暂停当前线程。
    • Interrupt():中断处于 Sleep/Wait 状态的线程。
    • Abort()(已过时):强制终止线程(不推荐)。
  • 属性
    • IsBackground:设置线程是否为后台线程(默认前台)。
    • Priority:线程优先级(HighestNormalLowest 等)。
    • 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:任务状态(RanToCompletionFaulted 等)。
    • 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();

八、不推荐使用的功能

  1. ​**Thread.Suspend()/Resume()**
    • 已过时,可能导致死锁或状态不一致。
  2. ​**Thread.Abort()**
    • 强制终止线程,可能引发资源泄漏。

总结

  • 优先选择 TPL(Task 和 async/await)​:简化异步编程,避免直接操作线程。
  • 同步机制:根据场景选择 lockSemaphoreMutex 或 Interlocked
  • 线程安全集合:替代手动同步,提升性能。
  • 取消机制:使用 CancellationToken 实现协作式取消。

合理使用这些工具可以高效处理并发任务,同时避免死锁、竞态条件等常见问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值