c#的线程间如何通信

avatar
作者
筋斗云
阅读量:0

在 C# 中,线程间通信可以通过以下几种方式实现:

  1. 使用 lock 关键字lock 关键字可以用于同步代码块,确保同一时间只有一个线程可以访问共享资源。当一个线程进入同步代码块时,其他线程必须等待该线程释放锁才能进入同步代码块。

    private object _lockObject = new object();  public void ThreadMethod() {     lock (_lockObject)     {         // 访问共享资源     } } 
  2. 使用 MonitorMonitor 类提供了更高级的线程同步机制,包括等待和通知功能。可以使用 Monitor.Enter()Monitor.Exit() 方法来获取和释放锁。

    private readonly object _lockObject = new object();  public void ThreadMethod() {     Monitor.Enter(_lockObject);     try     {         // 访问共享资源     }     finally     {         Monitor.Exit(_lockObject);     } } 
  3. 使用 SemaphoreSemaphore 类是一个计数信号量,用于控制同时访问共享资源的线程数。可以使用 Semaphore.WaitOne()Semaphore.Release() 方法来请求和释放许可。

    private readonly Semaphore _semaphore = new Semaphore(1);  public void ThreadMethod() {     _semaphore.WaitOne();     try     {         // 访问共享资源     }     finally     {         _semaphore.Release();     } } 
  4. 使用 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);     } } 
  5. 使用 MutexMutex 类是一个互斥量,用于确保同一时间只有一个线程可以访问共享资源。可以使用 Mutex.WaitOne()Mutex.ReleaseMutex() 方法来请求和释放互斥量。

    private readonly Mutex _mutex = new Mutex(true);  public void ThreadMethod() {     _mutex.WaitOne();     try     {         // 访问共享资源     }     finally     {         _mutex.ReleaseMutex();     } } 
  6. 使用 ChannelChannel 是 C# 7.0 引入的一种新型线程安全的数据结构,可以在不同的线程之间传递数据。可以使用 Channel.Create 方法创建一个通道,并使用 Channel.ReaderChannel.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); } 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!