温馨提示×

c#的线程间如何通信

c#
小樊
146
2024-09-23 18:40:41
栏目: 编程语言

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

0