C#線程等待

一、基礎概念

在多任務環境下,線程等待是非常重要的一個概念。線程等待可以讓一個線程等待另外一個線程完成某些操作,然後再繼續執行。在C#中,線程等待是通過System.Threading命名空間中的WaitHandle類和其派生類來實現的。

WaitHandle類提供WaitOne()和WaitAny()方法,它們都可以讓一個線程等待某個事件,直到該事件發生或超時。WaitOne()方法會等待一個WaitHandle對象的信號,並且支持超時;WaitAny()方法會等待多個WaitHandle對象中的任意一個被信號激活,並且支持超時。

在具體的應用場景中,我們可以使用ManualResetEvent、AutoResetEvent、CountdownEvent和SemaphoreSlim等類來創建WaitHandle對象。

二、ManualResetEvent和AutoResetEvent

ManualResetEvent和AutoResetEvent都是WaitHandle的派生類,它們可以用於線程等待。在 ManualResetEvent 中,線程會一直等待直到該事件被信號激活。而在 AutoResetEvent 中,線程會等待事件被信號激活一次,然後自動重置,以便於下次被信號激活。

下面是使用ManualResetEvent實現線程等待的代碼示例:

ManualResetEvent event1 = new ManualResetEvent(false);

ThreadPool.QueueUserWorkItem(state =>
{
    Console.WriteLine("Thread 1 is running");
    Thread.Sleep(1000);
    Console.WriteLine("Thread 1 set the event");
    event1.Set();
});

Console.WriteLine("Main thread is waiting for event");
event1.WaitOne();
Console.WriteLine("Main thread received event");

上述示例使用ManualResetEvent實現了一個線程等待的功能。在主線程中,首先創建了一個ManualResetEvent對象,並且初始化為未激活狀態。然後開啟一個新的線程,在該線程中等待1秒鐘,並且在1秒鐘後激活ManualResetEvent對象。在主線程中調用event1.WaitOne()方法等待事件的激活,直到該事件被激活後,主線程才會繼續執行。

三、CountdownEvent和SemaphoreSlim

CountdownEvent和SemaphoreSlim也是WaitHandle的派生類。CountdownEvent可以用來等待一組操作完成,而SemaphoreSlim可以用來控制同時執行的線程數量。

下面是使用CountdownEvent實現線程等待的代碼示例:

CountdownEvent countdown = new CountdownEvent(3);

for (int i = 1; i 
    {
        Console.WriteLine($"Thread {i} is running");
        Thread.Sleep(1000);
        Console.WriteLine($"Thread {i} is done");
        countdown.Signal();
    });
}

countdown.Wait();
Console.WriteLine("All threads are done");

上述示例使用CountdownEvent實現了同時等待多個線程完成的功能。首先創建了一個CountdownEvent對象,並且把初始計數器設置為3。然後開啟三個新的線程,在每個線程中等待1秒鐘,並且在1秒鐘後為CountdownEvent對象計數。在主線程中調用countdown.Wait()方法等待所有的線程完成,並且在所有線程完成後繼續執行。

下面是使用SemaphoreSlim實現控制線程數量的代碼示例:

SemaphoreSlim semaphore = new SemaphoreSlim(3);

for (int i = 1; i 
    {
        await semaphore.WaitAsync();
        Console.WriteLine($"Thread {i} start");
        Thread.Sleep(1000);
        Console.WriteLine($"Thread {i} end");
        semaphore.Release();
    });
}

上述示例使用SemaphoreSlim實現了在同一時間內只允許3個線程同時執行的功能。首先創建了一個SemaphoreSlim對象,並且初始計數器設置為3。然後使用ThreadPool開啟5個新的線程,在每個線程中等待SemaphoreSlim對象信號,當計數器大於0時,線程可以執行,並且計數器會減1。在線程執行完畢後,計數器會加1,以便於其他線程可以繼續執行。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/230197.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-10 18:16
下一篇 2024-12-10 18:16

相關推薦

  • Python線程等待指南

    本文將從多個方面詳細講解Python線程等待的相關知識。 一、等待線程結束 在多線程編程中,經常需要等待線程執行完畢再進行下一步操作。可以使用join()方法實現等待線程執行完畢再…

    編程 2025-04-29
  • Python兩個線程交替列印1到100

    這篇文章的主題是關於Python多線程的應用。我們將會通過實際的代碼,學習如何使用Python兩個線程交替列印1到100。 一、創建線程 在Python中,我們可以使用Thread…

    編程 2025-04-28
  • ROS線程發布消息異常解決方法

    針對ROS線程發布消息異常問題,我們可以從以下幾個方面進行分析和解決。 一、檢查ROS代碼是否正確 首先,我們需要檢查ROS代碼是否正確。可能會出現的問題包括: 是否正確初始化RO…

    編程 2025-04-28
  • Python線程池並發爬蟲

    Python線程池並發爬蟲是實現多線程爬取數據的常用技術之一,可以在一定程度上提高爬取效率和數據處理能力。本文將從多個方面對Python線程池並發爬蟲做詳細的闡述,包括線程池的實現…

    編程 2025-04-27
  • 線程池中的一個線程異常了會被怎麼處理

    本文將從以下幾個方面對線程池中的一個線程異常了會被怎麼處理進行詳細闡述:異常的類型、如何捕獲異常、異常的處理方式。 一、異常的類型 在線程池中,可以出現多種類型的異常,例如線程執行…

    編程 2025-04-27
  • 線程池的七個參數

    在多線程編程中,線程池是一種非常重要的編程模型,可以解決線程創建銷毀的開銷問題,提高程序的效率。在使用線程池時,需要對其七個參數進行配置,以達到最佳性能。下面將從多個方面詳細闡述線…

    編程 2025-04-25
  • Java DelayQueue:實現延遲任務的線程安全隊列

    一、DelayQueue的概述 Java的DelayQueue 是一個阻塞隊列隊列,主要用來實現對延遲任務的調度,也就是在指定的時間之後才能夠取出任務來執行。該隊列中保存的元素都必…

    編程 2025-04-23
  • 瀏覽器線程——從多個方面深入探討

    一、瀏覽器線程的概念 瀏覽器線程是指瀏覽器中用於處理不同任務的線程。默認情況下,每個標籤頁都會有一個獨立的進程,每個進程再包含多個線程,這些線程通過協同工作來完成瀏覽器的各項任務。…

    編程 2025-04-23
  • JMeter線程組詳解

    一、線程組簡介 JMeter作為一個負載測試工具,線程組是JMeter中非常重要的一個概念,它被用來模擬請求的發送。 簡單來說,JMeter通過線程組來同時模擬多個用戶對被測試的W…

    編程 2025-04-23
  • Java線程安全的集合

    Java的集合框架是廣泛使用的標準庫之一,它被設計為高效、靈活和安全。在多線程環境中,線程安全的集合至關重要,因為多個線程同時對同一個集合進行讀寫操作可能會導致數據的不一致和線程安…

    編程 2025-04-22

發表回復

登錄後才能評論