中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

基礎才是(shi)重中之重~delegate里(li)的Invoke和BeginInvoke

回到目錄

Invoke和BeginInvoke都(dou)是(shi)(shi)調用(yong)委托實(shi)(shi)體的方(fang)法,前者是(shi)(shi)同步(bu)調用(yong),即它(ta)運(yun)行(xing)(xing)在主線(xian)(xian)程上(shang),當Invode處理時(shi)間(jian)長(chang)時(shi),會(hui)(hui)出現阻塞的情(qing)況,而(er)BeginInvod是(shi)(shi)異步(bu)操(cao)作,它(ta)會(hui)(hui)從新開啟一個線(xian)(xian)程,所以不會(hui)(hui)租(zu)塞主線(xian)(xian)程,在使用(yong)BeginInvoke時(shi),如果希望(wang)等待(dai)執行(xing)(xing)的結果 ,可以使用(yong)EndInvoke來實(shi)(shi)現,這在.net framework4.5之后,被(bei)封(feng)裝成了async+await來實(shi)(shi)現,代碼(ma)更簡潔,更容易理解(jie)。

        delegate void test();
        static void Main(string[] args)
        {
            test ts = new test(TestDelegate);
            ts.Invoke(); //不會產生新線程(cheng)
            Console.WriteLine("hello");
        }

        internal static void TestDelegate()
        {
            Thread.Sleep(1000);
        }

此時(shi),在主(zhu)線程中出現了1秒的(de)租塞,因為Invoke是同步的(de)。

下面再(zai)來看(kan)一(yi)下BeginInvoke的(de)實現

        delegate string test();
        static void Main(string[] args)
        {
            test ts = new test(TestDelegate);
           IAsyncResult result = ts.BeginInvoke(null,null); //會在新線程中(zhong)執(zhi)行(xing)
            string resultstr=ts.EndInvoke(result);
            Console.WriteLine(resultstr);
        }

        internal static string TestDelegate()
        {
            Thread.Sleep(1000);
            return "hello"
        }

上面的(de)代碼會在新線程中執(zhi)行,并且(qie)平會對主線程產(chan)生(sheng)租塞,同時它可(ke)以(yi)獲取自(zi)己的(de)返回值,使用EndInvoke實現!

感謝閱讀!小小的知識(shi)點我(wo)們(men)也(ye)要(yao)好好理(li)解。

回到目錄

posted @ 2018-05-24 14:48  張占嶺  閱讀(2879)  評論(9)    收藏  舉報