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

C#多線程之線程通訊(AutoResetEvent)

 更新時間:2022年04月20日 10:11:55   作者:農(nóng)碼一生  
這篇文章介紹了C#多線程之線程通訊(AutoResetEvent)的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、簡介

我們在線程編程的時候往往會涉及到線程的通信,通過信號的接受來進(jìn)行線程是否阻塞的操作。
AutoResetEvent 允許線程通過發(fā)信號互相通信。通常,此通信涉及線程需要獨(dú)占訪問的資源。具體方法和擴(kuò)展方法請?jiān)斠夾utoResetEvent類,最常用方法中就有Set()和WaitOne()。
線程通過調(diào)用 AutoResetEvent 上的 WaitOne 來等待信號。如果 AutoResetEvent 處于非終止?fàn)顟B(tài),則該線程阻塞,并等待當(dāng)前控制資源的線程通過調(diào)用 Set 發(fā)出資源可用的信號。AutoResetEvent 的非終止?fàn)顟B(tài)可以通過構(gòu)造函數(shù)在設(shè)置。
通俗的來講只有等myResetEven.Set()成功運(yùn)行后,myResetEven.WaitOne()才能夠獲得運(yùn)行機(jī)會;Set是發(fā)信號,WaitOne是等待信號,只有發(fā)了信號,
等待的才會執(zhí)行。如果不發(fā)的話,WaitOne后面的程序就永遠(yuǎn)不會執(zhí)行。

AutoResetEvent myEvent = new AutoResetEvent(false);

這里構(gòu)造函數(shù)中的參數(shù)false就代表該狀態(tài)為非終止?fàn)顟B(tài),相反若為true則為終止?fàn)顟B(tài)。

二、代碼

案例一:

    public class Program
    {
        const int cycleNum = 10;static void Main(string[] args)
        {
            // 參數(shù):
            // workerThreads:
            // 要由線程池根據(jù)需要創(chuàng)建的新的最小工作程序線程數(shù)。
            // completionPortThreads:
            // 要由線程池根據(jù)需要創(chuàng)建的新的最小空閑異步 I/O 線程數(shù)。
            // 返回結(jié)果:如果更改成功,則為 true;否則為 false。
            //public static bool SetMinThreads(int workerThreads, int completionPortThreads);
            ThreadPool.SetMinThreads(1, 1);
            // 參數(shù):
            // workerThreads:
            // 線程池中輔助線程的最大數(shù)目。
            // completionPortThreads:
            // 線程池中異步 I/O 線程的最大數(shù)目。
            // 返回結(jié)果:如果更改成功,則為 true;否則為 false。
            //public static bool SetMaxThreads(int workerThreads, int completionPortThreads);
            ThreadPool.SetMaxThreads(5, 5);
            for (int i = 1; i <= cycleNum; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(testFun), i.ToString());
            }
            Console.WriteLine("主線程執(zhí)行!");
            Console.WriteLine("主線程終止!");
            Console.WriteLine("線程池終止!");
            Console.ReadKey();
        }
        public static void testFun(object obj)
        {
            Console.WriteLine(string.Format("{0}:第{1}個線程", DateTime.Now.ToString(), obj.ToString()));
            Thread.Sleep(5000);
        }
    }

運(yùn)行結(jié)果:

這里可以看出,線程池里線程的執(zhí)行不影響主線程的運(yùn)行,線程池雖然可以管理多線程的執(zhí)行,但是卻無法知道它什么時候終止。

案例二:

    public class Program
    {
        const int cycleNum = 10;
        static int cnt = 10;
        static AutoResetEvent myEvent = new AutoResetEvent(false);
        static void Main(string[] args)
        {
            // 參數(shù):
            // workerThreads:
            // 要由線程池根據(jù)需要創(chuàng)建的新的最小工作程序線程數(shù)。
            // completionPortThreads:
            // 要由線程池根據(jù)需要創(chuàng)建的新的最小空閑異步 I/O 線程數(shù)。
            // 返回結(jié)果:如果更改成功,則為 true;否則為 false。
            //public static bool SetMinThreads(int workerThreads, int completionPortThreads);
            ThreadPool.SetMinThreads(1, 1);
            // 參數(shù):
            // workerThreads:
            // 線程池中輔助線程的最大數(shù)目。
            // completionPortThreads:
            // 線程池中異步 I/O 線程的最大數(shù)目。
            // 返回結(jié)果:如果更改成功,則為 true;否則為 false。
            //public static bool SetMaxThreads(int workerThreads, int completionPortThreads);
            ThreadPool.SetMaxThreads(5, 5);
            for (int i = 1; i <= cycleNum; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(testFun), i.ToString());
            }
            Console.WriteLine("主線程執(zhí)行!");
            Console.WriteLine("主線程終止!");
            myEvent.WaitOne();
            Console.WriteLine("線程池終止!");
            Console.ReadKey();
        }
        public static void testFun(object obj)
        {
            cnt -= 1;//信號量自減
            Console.WriteLine(string.Format("{0}:第{1}個線程", DateTime.Now.ToString(), obj.ToString()));
            Thread.Sleep(5000);
            if (cnt == 0)
            {
                myEvent.Set();
            }
        }
    }

運(yùn)行結(jié)果:

上面例子中一開始非終止?fàn)顟B(tài),當(dāng)遇到WaitOne()方法時則會阻塞線程,在沒有set()時將一直處于阻塞狀態(tài).

三、總結(jié)

既然說到了AutoResetEvent,就不得不說ManualResetEvent,這兩個方法幾乎相同,不同的地方就在于AutoResetEvent的WaitOne()方法執(zhí)行后會自動又將信號置為不發(fā)送狀態(tài)也就是阻塞狀態(tài),當(dāng)再次遇到WaitOne()方法是又會被阻塞,而ManualResetEvent則不會,只要線程處于非阻塞狀態(tài)則無論遇到多少次WaitOne()方法都不會被阻塞,除非調(diào)用ReSet()方法來手動阻塞線程。

到此這篇關(guān)于C#多線程之線程通訊(AutoResetEvent)的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

年辖:市辖区| 青州市| 巴彦淖尔市| 施秉县| 利川市| 龙胜| 北宁市| 鄂尔多斯市| 辰溪县| 岳池县| 麻城市| 鹰潭市| 松原市| 昆山市| 武汉市| 潍坊市| 沭阳县| 通道| 明水县| 建昌县| 革吉县| 博乐市| 广饶县| 苏尼特左旗| 兰溪市| 藁城市| 东安县| 乌拉特后旗| 天水市| 淳化县| 武功县| 北安市| 马尔康县| 姜堰市| 民丰县| 子长县| 卢湾区| 宝应县| 海阳市| 禄丰县| 奈曼旗|