在 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);
}