中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#手動線程通知怎么實現

發布時間:2022-02-14 09:24:52 來源:億速云 閱讀:176 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“C#手動線程通知怎么實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C#手動線程通知怎么實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

區別與示例

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

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

AutoResetEvent 示例:

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

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

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

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

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

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

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

ManualResetEvent 類示例:

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

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

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

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

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

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

ManualResetEvent 類

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

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

它們的使用區別主要是:

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

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

其構造函數如下:

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

其常用方法如下:

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

ManualResetEventSlim

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

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

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

讀到這里,這篇“C#手動線程通知怎么實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乌鲁木齐市| 西贡区| 韩城市| 定边县| 巩留县| 宁安市| 永和县| 化德县| 青河县| 雷山县| 安远县| 丰原市| 治县。| 成安县| 平江县| 玉屏| 莒南县| 贵南县| 通城县| 安西县| 金华市| 福清市| 佛冈县| 会东县| 双牌县| 黔江区| 四会市| 常德市| 虎林市| 抚宁县| 万山特区| 九龙县| 东源县| 辽阳市| 察隅县| 留坝县| 富锦市| 正宁县| 建德市| 泽库县| 龙井市|