欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#多線程系列之手動線程通知

 更新時間:2022年02月13日 15:46:33   作者:癡者工良  
本文詳細講解了C#多線程中的手動線程通知,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

區(qū)別與示例

AutoResetEvent 和 ManualResetEvent 十分相似。兩者之間的區(qū)別,在于前者是自動(Auto),后者是手動(Manua)。

你可以先運行下面的示例,再測試兩者的區(qū)別。

AutoResetEvent 示例:

    class Program
    {
        // 線程通知
        private static AutoResetEvent resetEvent = new AutoResetEvent(false);

        static void Main(string[] args)
        {
            // 創(chuàng)建線程
            new Thread(DoOne).Start();

            // 用于不斷向另一個線程發(fā)送信號
            while (true)
            {
                Console.ReadKey();
                resetEvent.Set();           // 發(fā)生通知,設(shè)置終止狀態(tài)
            }
        }

        public static void DoOne()
        {
            Console.WriteLine("① 等待中,請發(fā)出信號允許我運行");
            resetEvent.WaitOne();

            Console.WriteLine("② 等待中,請發(fā)出信號允許我運行");

            resetEvent.WaitOne();
            Console.WriteLine("③ 等待中,請發(fā)出信號允許我運行");
            
            // ...

            Console.WriteLine("線程結(jié)束");
        }
    }

ManualResetEvent 類示例:

    class Program
    {
        private static ManualResetEvent resetEvent = new ManualResetEvent(false);
        static void Main(string[] args)
        {
            new Thread(DoOne).Start();
            // 用于不斷向另一個線程發(fā)送信號
            while (true)
            {
                Console.ReadKey();
                resetEvent.Set();           // 發(fā)生通知,設(shè)置終止狀態(tài)
            }
        }

        public static void DoOne()
        {
            Console.WriteLine("等待中,請發(fā)出信號允許我運行");
            resetEvent.WaitOne();

            // 后面的都無效,線程會直接跳過而無需等待
            resetEvent.WaitOne();
            resetEvent.WaitOne();
            resetEvent.WaitOne();
            resetEvent.WaitOne();
            resetEvent.WaitOne();
            Console.WriteLine("線程結(jié)束");
        }
    }

因為 AutoResetEvent 對象在 .WaitOne() 方法等待信號完畢后,會自動重置為非終止狀態(tài),相當于高速收費站自動閘門,一輛車過去后,機器自動關(guān)閘。

ManualResetEvent 相當于人工閘門,打開后編寫人工關(guān)閉閘門,不然的話閘門會一直處于打開狀態(tài)。

ManualResetEvent 主要用于更加靈活的線程信號傳遞場景。

ManualResetEvent 類

表示線程同步事件,收到信號時,要想下一次依然生效,必須手動重置該事件。

因為 ManualResetEvent 類跟 AutoManualResetEvent 類十分接近,這里就不贅述了。

它們的使用區(qū)別主要是:

AutoResetEvent 類,每次 Set() ,跳過一個 WaitOne()。因為會 自動恢復設(shè)置,所以下次碰到 WaitOne() 會繼續(xù)等待。

ManualResetEvent 類, Set() 后,不會重置設(shè)置,因此一旦使用了 Set() 后,就會一路放通,不會再等待。

其構(gòu)造函數(shù)如下:

構(gòu)造函數(shù)說明
ManualResetEvent(Boolean)用一個指示是否將初始狀態(tài)設(shè)置為終止的布爾值初始化 ManualResetEvent 類的新實例。

其常用方法如下:

方法說明
Close()釋放由當前 WaitHandle 占用的所有資源。
Reset()將事件狀態(tài)設(shè)置為非終止,從而導致線程受阻。
Set()將事件狀態(tài)設(shè)置為有信號,從而允許一個或多個等待線程繼續(xù)執(zhí)行。
WaitOne()阻止當前線程,直到當前 WaitHandle 收到信號。
WaitOne(Int32)阻止當前線程,直到當前 WaitHandle 收到信號,同時使用 32 位帶符號整數(shù)指定時間間隔(以毫秒為單位)。
WaitOne(Int32, Boolean)阻止當前線程,直到當前的 WaitHandle 收到信號為止,同時使用 32 位帶符號整數(shù)指定時間間隔,并指定是否在等待之前退出同步域。
WaitOne(TimeSpan)阻止當前線程,直到當前實例收到信號,同時使用 TimeSpan 指定時間間隔。
WaitOne(TimeSpan, Boolean)阻止當前線程,直到當前實例收到信號為止,同時使用 TimeSpan 指定時間間隔,并指定是否在等待之前退出同步域。

ManualResetEventSlim

ManualResetEventSlim 相對 ManualResetEvent ,當?shù)却龝r間預計非常短并且事件不跨越進程邊界時,可以使用此類來獲得比 ManualResetEvent 更好的性能。

從代碼使用來看,沒有啥區(qū)別,主要就是考慮性能下時,兩者不同場景。

這里就不對這兩個類型贅述了。

到此這篇關(guān)于C#多線程系列之手動線程通知的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺析C# 函數(shù)的傳值與傳址

    淺析C# 函數(shù)的傳值與傳址

    這篇文章主要介紹了C# 函數(shù)的傳值與傳址,幫助大家更好的理解和學習c#,感興趣的朋友可以了解下
    2020-11-11
  • C#實現(xiàn)語音播報功能

    C#實現(xiàn)語音播報功能

    這篇文章主要為大家詳細介紹了C#實現(xiàn)語音播報功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • VS2013創(chuàng)建Windows服務與調(diào)試服務的圖文方法

    VS2013創(chuàng)建Windows服務與調(diào)試服務的圖文方法

    這篇文章主要介紹了VS2013創(chuàng)建Windows服務與調(diào)試服務的圖文方法,需要的朋友可以參考下
    2017-02-02
  • C#裝飾器模式(Decorator Pattern)實例教程

    C#裝飾器模式(Decorator Pattern)實例教程

    這篇文章主要介紹了C#裝飾器模式(Decorator Pattern),以一個完整實例形式講述了C#裝飾器模式的實現(xiàn)過程,有助于深入理解C#程序設(shè)計思想,需要的朋友可以參考下
    2014-09-09
  • C# 獲取系統(tǒng)字體的示例代碼

    C# 獲取系統(tǒng)字體的示例代碼

    這篇文章主要介紹了C# 獲取系統(tǒng)字體的方法,文中講解非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • c#字符串編碼問題的處理解決

    c#字符串編碼問題的處理解決

    這篇文章主要介紹了c#字符串編碼問題的處理解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • c# 抓取Web網(wǎng)頁數(shù)據(jù)分析

    c# 抓取Web網(wǎng)頁數(shù)據(jù)分析

    通過程序自動的讀取其它網(wǎng)站網(wǎng)頁顯示的信息,類似于爬蟲程序。比方說我們有一個系統(tǒng),要提取BaiDu網(wǎng)站上歌曲搜索排名。分析系統(tǒng)在根據(jù)得到的數(shù)據(jù)進行數(shù)據(jù)分析。為業(yè)務提供參考數(shù)據(jù)。
    2008-11-11
  • c# dynamic的使用詳解

    c# dynamic的使用詳解

    這篇文章主要介紹了c# dynamic的使用詳解,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-04-04
  • C# Dynamic關(guān)鍵字之:解析dynamic就是Object

    C# Dynamic關(guān)鍵字之:解析dynamic就是Object

    本篇文章是對C#中dynamic關(guān)鍵字就是Object進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C#實現(xiàn)帶百分比的進度條功能示例

    C#實現(xiàn)帶百分比的進度條功能示例

    這篇文章主要介紹了C#實現(xiàn)帶百分比的進度條功能,分析了帶百分比進度條的功能需求并結(jié)合實例形式給出了具體實現(xiàn)步驟與相關(guān)操作方法,需要的朋友可以參考下
    2017-05-05

最新評論