最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ā)生通知,設置終止狀態(tài)
            }
        }

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

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

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

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

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ā)生通知,設置終止狀態(tài)
            }
        }

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

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

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

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

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

ManualResetEvent 類

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

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

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

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

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

其構造函數如下:

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

其常用方法如下:

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

ManualResetEventSlim

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

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

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

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

相關文章

  • C# 遍歷datatable字段名和value的案例

    C# 遍歷datatable字段名和value的案例

    這篇文章主要介紹了C# 遍歷datatable字段名和value的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C# wpf使用ffmpeg命令行實現錄屏的示例代碼

    C# wpf使用ffmpeg命令行實現錄屏的示例代碼

    本文主要介紹了C# wpf使用ffmpeg命令行實現錄屏的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • 優(yōu)雅又實用的C#代碼優(yōu)化技巧分享

    優(yōu)雅又實用的C#代碼優(yōu)化技巧分享

    這篇文章主要為大家整理了一些優(yōu)雅又實用的C#代碼優(yōu)化技巧,文中的示例代碼講解詳細,對我們深入了解C#有一定的幫助,需要的可以參考一下
    2023-06-06
  • c#構造初始化的順序淺析

    c#構造初始化的順序淺析

    這篇文章介紹了c#構造初始化的順序,有需要的朋友可以參考一下
    2013-08-08
  • 淺談C#中的Infinity和NaN

    淺談C#中的Infinity和NaN

    下面小編就為大家?guī)硪黄獪\談C#中的Infinity和NaN。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • C#使用FileInfo和DirectoryInfo類來執(zhí)行文件和文件夾操作

    C#使用FileInfo和DirectoryInfo類來執(zhí)行文件和文件夾操作

    System.IO.FileInfo?和?System.IO.DirectoryInfo?是C#中用于操作文件和文件夾的類,它們提供了許多有用的方法和屬性來管理文件和文件夾,這篇文章主要介紹了C#使用FileInfo和DirectoryInfo類來執(zhí)行文件和文件夾操作,需要的朋友可以參考下
    2023-08-08
  • c#對象初始化順序實例分析

    c#對象初始化順序實例分析

    這篇文章主要介紹了c#對象初始化順序,實例分析了C#對象初始化的相關使用技巧與調用順序,需要的朋友可以參考下
    2015-06-06
  • C# 枚舉的使用簡介

    C# 枚舉的使用簡介

    這篇文章主要介紹了C# 枚舉的簡單使用,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • 詳解c# SpinWait

    詳解c# SpinWait

    這篇文章主要介紹了c# SpinWait的相關資料,幫助大家更好的理解和學習c# 編程,感興趣的朋友可以了解下
    2020-10-10
  • C#實現從PDF中提取表格的方法詳解

    C#實現從PDF中提取表格的方法詳解

    PDF是辦公中比較常見的一種文件格式,在工作中應用也越來越普遍。今天為大家介紹一種通過C#/VB.NET代碼從PDF中提取表格內容的方法,感興趣的可以動手嘗試一下
    2022-08-08

最新評論

青冈县| 类乌齐县| 会东县| 娱乐| 石城县| 玛多县| 崇州市| 宝兴县| 乌海市| 浮山县| 大埔区| 黄龙县| 陈巴尔虎旗| 乌拉特前旗| 宜宾市| 遂平县| 五台县| 罗城| 水城县| 大丰市| 昌吉市| 连州市| 嘉兴市| 皋兰县| 逊克县| 措美县| 沙河市| 祁阳县| 江华| 黄浦区| 淅川县| 资阳市| 嘉禾县| 定日县| 静安区| 湟中县| 宜兰市| 台湾省| 五指山市| 宝应县| 小金县|