在 C# 中,线程间通信可以通过以下几种方式实现:
使用
lock
关键字:lock
关键字可以用于同步代码块,确保同一时间只有一个线程可以访问共享资源。当一个线程进入同步代码块时,其他线程必须等待该线程释放锁才能进入同步代码块。private object _lockObject = new object(); public void ThreadMethod() { lock (_lockObject) { // 访问共享资源 } }
使用
Monitor
类:Monitor
类提供了更高级的线程同步机制,包括等待和通知功能。可以使用Monitor.Enter()
和Monitor.Exit()
方法来获取和释放锁。private readonly object _lockObject = new object(); public void ThreadMethod() { Monitor.Enter(_lockObject); try { // 访问共享资源 } finally { Monitor.Exit(_lockObject); } }
使用
Semaphore
类:Semaphore
类是一个计数信号量,用于控制同时访问共享资源的线程数。可以使用Semaphore.WaitOne()
和Semaphore.Release()
方法来请求和释放许可。private readonly Semaphore _semaphore = new Semaphore(1); public void ThreadMethod() { _semaphore.WaitOne(); try { // 访问共享资源 } finally { _semaphore.Release(); } }
使用
Monitor.Wait()
和Monitor.Pulse()
方法:Monitor.Wait()
方法用于让当前线程等待,直到被其他线程通过Monitor.Pulse()
或Monitor.PulseAll()
方法唤醒。Monitor.Pulse()
方法用于唤醒等待队列中的一个线程,而Monitor.PulseAll()
方法用于唤醒等待队列中的所有线程。private readonly object _lockObject = new object(); public void ThreadMethod1() { lock (_lockObject) { // 等待被唤醒 Monitor.Wait(_lockObject); } } public void ThreadMethod2() { lock (_lockObject) { // 唤醒等待的线程 Monitor.Pulse(_lockObject); } }
使用
Mutex
类:Mutex
类是一个互斥量,用于确保同一时间只有一个线程可以访问共享资源。可以使用Mutex.WaitOne()
和Mutex.ReleaseMutex()
方法来请求和释放互斥量。private readonly Mutex _mutex = new Mutex(true); public void ThreadMethod() { _mutex.WaitOne(); try { // 访问共享资源 } finally { _mutex.ReleaseMutex(); } }
使用
Channel
类:Channel
是 C# 7.0 引入的一种新型线程安全的数据结构,可以在不同的线程之间传递数据。可以使用Channel.Create
方法创建一个通道,并使用Channel.Reader
和Channel.Writer
对象进行读写操作。private Channel<int> _channel = Channel.CreateUnbounded<int>(); public async Task ThreadMethod1() { await _channel.Writer.WriteAsync(42); } public async Task ThreadMethod2() { int value = await _channel.Reader.ReadAsync(); Console.WriteLine(value); }