c#

c#的线程间如何通信

小樊
90
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
看了该问题的人还看了