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

C#中async和await的深入分析

 更新時間:2022年11月09日 11:03:02   作者:code?bean  
Async/Await是C# 5引入的關鍵字,用以提高用戶界面響應能力和對Web資源的訪問能力,同時它使異步代碼的編寫變得更加容易,下面這篇文章主要給大家介紹了關于C#中async和await的相關資料,需要的朋友可以參考下

大概理解

查了一個小時的資料:async和await

發(fā)現(xiàn)這個大神的解釋一針見血,深得我心!以最簡單的例子,解釋了async和await。妙~~~

大多情況下,分開才能體現(xiàn)async和await的價值!

 但,await 并沒有這么簡單。

深入分析

await和Wait()的區(qū)別

接下來繼續(xù)往下看:

await Task.Delay(3000);  和Task.Delay(3000).Wait();   有沒有區(qū)別?

上代碼:

using System.Diagnostics;
 
namespace await_async2
{
    internal class Program
    {
 
        static  public void TestWait()
        {
            var t = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("Start");
                Task.Delay(3000).Wait();
                Console.WriteLine("Done");
            });
            t.Wait();
            Console.WriteLine("All done");
        }
 
 
        static public void TestWait2()
        {
            var t = Task.Factory.StartNew(async () =>
            {
                Console.WriteLine("Start");
                await Task.Delay(3000);
                Console.WriteLine("Done");
            });
            t.Wait();
            Console.WriteLine("All done");
        }
 
        static public void TestWait3()
        {
            var t = Task.Run(async () =>
            {
                Console.WriteLine("Start");
                await Task.Delay(3000);
                Console.WriteLine("Done");
            });
            t.Wait();
            Console.WriteLine("All done");
        }
 
        static void Main(string[] args)
        {
            TestWait2();
            //避免程序提前退出,導致一些現(xiàn)象看不到
            Task.Delay(5000).Wait();
        }
    }
}

首先,強調(diào)一下,最后一句 Task.Delay(5000).Wait(); 是必須的,不然,程序提前退出,導致一些現(xiàn)象看不到,從而蒙蔽了我們。

第1段代碼TestWait執(zhí)行效果,如下:

第2段代碼TestWait2執(zhí)行效果,如下:

第3段代碼TestWait3執(zhí)行效果,如下:

現(xiàn)在給出結論:

Task.Delay(3000).Wait(); 這個就是同步等。

await Task.Delay(3000); 因為沒有分開來寫(見第一張圖),所以基本和同步等沒有區(qū)別。

但是如果 await Task.Delay(3000); 是寫到:Task.Factory.StartNew里面的

static public void TestWait2()
        {
            var t = Task.Factory.StartNew(async () =>
            {
                Console.WriteLine("Start");
                await Task.Delay(3000);
                Console.WriteLine("Done");
            });
            t.Wait();
            Console.WriteLine("All done");
        }

那這個效果不一樣了,他們執(zhí)行的權限丟出去了有點像python里的yeild,來看下程序的執(zhí)行順序:

 這里就看出了:await Task.Delay(3000);  和Task.Delay(3000).Wait(); 的區(qū)別了。(但是這種情況如果在道Task.Run里面就體現(xiàn)不出來!)

然后,我有簡單做了一個實驗:

這就更明了了, await Task.Delay(3000); 就像設置了一個回調(diào),一旦三秒時間一到,程序的指針就會回到await Task.Delay(3000);后面的位置,直到函數(shù)執(zhí)行結束。再回到之前的位置。這就是所謂的用同步的方式寫異步的代碼吧

但是,為啥在Task.Factory.StartNew才會體現(xiàn)出來,這個我就不清楚了,請各位大佬指點一下。

去掉Task.Run的Wait

再來對比一下,下面這兩個函數(shù):

 static public void TestWait8()
 {
     var t = Task.Run(async () =>
     {
         Console.WriteLine("Start");
         await Task.Delay(3000);
         Console.WriteLine("Done");
     });
     Console.WriteLine("All done");
 }
 static public void TestWait8_5()
 {
     var t = Task.Factory.StartNew(async () =>
     {
         Console.WriteLine("Start");
         await Task.Delay(3000);
         Console.WriteLine("Done");
     });
     t.Wait();
     Console.WriteLine("All done");
 }

先看第一個TestWait8,由于Task.Run不再調(diào)用 t.Wait(),Task.Run內(nèi)部這個線程主線程是并行的關系。程序指針會在兩個線程中來回切換。如果一方中寫了await xxx,那程序指針必然跳到另一個線程。直達await結束才可能返回。 這種情形是比較多的。此時await能節(jié)省大量等待時間(比如IO操作時間),充分利用等待時間。

此時 Console.WriteLine("All done");會最先被打印出來。

再看第二個TestWait8_5(其實就是回顧一下),當程序執(zhí)行到t.Wait()時,程序不會繼續(xù)向下了,(此時因為有t.Wait()的存在,所以子線程其實是優(yōu)先于主線程的)而是進入到子線程的內(nèi)部進程,試圖將這個線程執(zhí)行完,但是再線程里面遇到又遇到await Task.Delay(3000);此時程序指針不會再這里死等,程序指針又跳回主線程繼續(xù)執(zhí)行,直到三秒到了之后就會回到子線程,子線程執(zhí)行完了之后,再回到主線程。

但是如果吧TestWait8_5 中    Task.Factory.StartNew 換成 Task.Run ,那么前面的過程一樣,只是執(zhí)行到await Task.Delay(3000);時候,此時會死等,不會跳到主線程,而是一定等到這個子線程完結,再回主線程。

小結

總結一下就是,遇到await 一定會等,至于程序指針是先跳到其他線程,還是在此線程死等,就看你的線程函數(shù)這么寫的了。

其他

.Await();

最后,還有個:Task.Delay(3000).Await();

這個是prsim對Task寫的的一個拓展方法(避免在主線程調(diào)用時,阻塞UI):

總結

到此這篇關于C#中async和await的文章就介紹到這了,更多相關C# async和await內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

宜兰县| 青龙| 清新县| 贺兰县| 灌阳县| 锦州市| 青州市| 崇义县| 米易县| 玛曲县| 江山市| 钟山县| 冀州市| 疏附县| 林口县| 临西县| 扬州市| 托里县| 广元市| 普兰县| 屏东县| 本溪| 宝鸡市| 皋兰县| 永丰县| 邳州市| 集贤县| 河东区| 鄂托克旗| 印江| 永平县| 台前县| 榆树市| 乌鲁木齐市| 萝北县| 大荔县| 邵东县| 福安市| 隆尧县| 静安区| 仙桃市|