c#的線程間如何通信

c#
小樊
90
2024-09-23 18:40:41
欄目: 編程語言

在 C# 中,線程間通信可以通過以下幾種方式實(shí)現(xiàn):

  1. 使用 lock 關(guān)鍵字lock 關(guān)鍵字可以用于同步代碼塊,確保同一時(shí)間只有一個(gè)線程可以訪問共享資源。當(dāng)一個(gè)線程進(jìn)入同步代碼塊時(shí),其他線程必須等待該線程釋放鎖才能進(jìn)入同步代碼塊。

    private object _lockObject = new object();
    
    public void ThreadMethod()
    {
        lock (_lockObject)
        {
            // 訪問共享資源
        }
    }
    
  2. 使用 MonitorMonitor 類提供了更高級(jí)的線程同步機(jī)制,包括等待和通知功能??梢允褂?Monitor.Enter()Monitor.Exit() 方法來獲取和釋放鎖。

    private readonly object _lockObject = new object();
    
    public void ThreadMethod()
    {
        Monitor.Enter(_lockObject);
        try
        {
            // 訪問共享資源
        }
        finally
        {
            Monitor.Exit(_lockObject);
        }
    }
    
  3. 使用 SemaphoreSemaphore 類是一個(gè)計(jì)數(shù)信號(hào)量,用于控制同時(shí)訪問共享資源的線程數(shù)??梢允褂?Semaphore.WaitOne()Semaphore.Release() 方法來請(qǐng)求和釋放許可。

    private readonly Semaphore _semaphore = new Semaphore(1);
    
    public void ThreadMethod()
    {
        _semaphore.WaitOne();
        try
        {
            // 訪問共享資源
        }
        finally
        {
            _semaphore.Release();
        }
    }
    
  4. 使用 Monitor.Wait()Monitor.Pulse() 方法Monitor.Wait() 方法用于讓當(dāng)前線程等待,直到被其他線程通過 Monitor.Pulse()Monitor.PulseAll() 方法喚醒。Monitor.Pulse() 方法用于喚醒等待隊(duì)列中的一個(gè)線程,而 Monitor.PulseAll() 方法用于喚醒等待隊(duì)列中的所有線程。

    private readonly object _lockObject = new object();
    
    public void ThreadMethod1()
    {
        lock (_lockObject)
        {
            // 等待被喚醒
            Monitor.Wait(_lockObject);
        }
    }
    
    public void ThreadMethod2()
    {
        lock (_lockObject)
        {
            // 喚醒等待的線程
            Monitor.Pulse(_lockObject);
        }
    }
    
  5. 使用 MutexMutex 類是一個(gè)互斥量,用于確保同一時(shí)間只有一個(gè)線程可以訪問共享資源??梢允褂?Mutex.WaitOne()Mutex.ReleaseMutex() 方法來請(qǐng)求和釋放互斥量。

    private readonly Mutex _mutex = new Mutex(true);
    
    public void ThreadMethod()
    {
        _mutex.WaitOne();
        try
        {
            // 訪問共享資源
        }
        finally
        {
            _mutex.ReleaseMutex();
        }
    }
    
  6. 使用 ChannelChannel 是 C# 7.0 引入的一種新型線程安全的數(shù)據(jù)結(jié)構(gòu),可以在不同的線程之間傳遞數(shù)據(jù)??梢允褂?Channel.Create 方法創(chuàng)建一個(gè)通道,并使用 Channel.ReaderChannel.Writer 對(duì)象進(jìn)行讀寫操作。

    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