初探asp.net異步編程之await


      終於畢業了,也順利進入一家期望的旅游互聯網公司。27號入職。放肆了一個多月沒寫代碼,好方啊。

      另外一下觀點均主要針對於await.

      請先看這段話,來自async in C# 5.0.  接下來幾個月的時間,我將花時間來簡單翻譯這本書。

     

寫在前面(帶着問題學習)
一.根據代碼和執行結果,初探異步編程的執行過程。

*問題1:await會讓當前線程一直等待嗎?await等待的時間中一直占用線程資源嗎?

*問題2:等待await數據返回交給等待線程再繼續向下執行嗎?

*問題3:向await下一條語句執行的線程,是執行await的線程嗎?

二.異步編程async,await的使用意義和適用場景。

*問題1:異步編程可以讓程序變快嗎?

*問題2:異步編程執行耗時計算有用嗎?

*問題3:既然異步編程執行順序和同步相同,那么其意義何在?

解惑一(初步結果)
測試代碼
 class Program
    {
        static void Main(string[] args)
        {
            Task.Run(()=>FirsTask());
            Console.ReadLine();
        }
        public static async Task<string> FirsTask()
        {
            Console.WriteLine("1.當前線程是:" + Thread.CurrentThread.ManagedThreadId);
            var result = await SecondTask();
            Console.WriteLine("6.當前線程是:" + Thread.CurrentThread.ManagedThreadId);
            return result;
        }
        public static async Task<string> SecondTask()
        {
            using (var client = new HttpClient())
            {
                Console.WriteLine("2.當前線程是:" + Thread.CurrentThread.ManagedThreadId);
                var result = await client.GetAsync(
                    "http://stackoverflow.com/questions/37991851/jenkins-configure-page-not-loading-version1-651-3-chrome-browser");
                await ThirdTask();
                Console.WriteLine("5.當前線程是:" + Thread.CurrentThread.ManagedThreadId);
                return await result.Content.ReadAsStringAsync();
            }
        }
        public static async Task<string> ThirdTask()
        {
            using (var client = new HttpClient())
            {
                Console.WriteLine("3.當前線程是:" + Thread.CurrentThread.ManagedThreadId);
                var result = await client.GetAsync(
                    "http://stackoverflow.com/questions/37993657/managing-outgoing-calls-settings-in-skype-for-business-client-using-remote-power");
                Console.WriteLine("4.當前線程是:" + Thread.CurrentThread.ManagedThreadId);
                return await result.Content.ReadAsStringAsync();
            }
        }
    }
輸出結果
輸出結果說明了前三個問題:
  我們可以看到輸出1和6,2和5,3和4往往不是相同的線程,但是也 未必不是相同的線程。 事實證明,await 不會讓當前線程等待await的結果,繼而由等待線程繼續向下執行。 而是,遇到await時,當前線程會被 釋放到線程池。在await返回結果后,在 調用任意空閑線程向下執行
解惑二(意義和用途)
  由於當前線程遇到await時會被 釋放到線程池不會在時間上的等待中 占用線程資源。 事實也證明,我們當前異步代碼的執行順序和同步代碼 執行順序是相同的,在這樣的情況下,線程被釋放就是可以被重復利用的。 這樣的重要意義在於,iis中線程池線程數是有限的,如果當前可以並發一百個請求,在同步情況下, 那么一百個請求導致一百個線程都在等待中。但是在異步過程中,線程被釋放了,阻塞等待的時間沒有了,也就可以 容納更多的請求。 程序要向下執行,依然要等到await結果,所以說同步和異步的 執行時間是一樣的,不會因為異步而減少執行時間。

  異步編程特別適用於網絡操作,因為網絡操作發起請求之后等待它完成就行,所以這時候執行到這的線程,可以釋放並會到線程池中,網絡操作執行完成之后,再從線程池中隨機拿一個線程繼續執行。

  

最后的補充:剛才討論的是await的作用。之所以如上測試代碼能夠按照同步的過程來執行,是await的作用。比如我們在FirstTask中不等待SecondTask的結果時,那么執行順序是會改變的,6會提前輸出出來。這是async的作用,不阻塞線程。我個人認為,在不需要await結果的情況下,async是可以減少執行時間的。

 

轉載請注明本文地址: http://www.cnblogs.com/tdws/p/5613871.html%20%20%20%20

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM