終於畢業了,也順利進入一家期望的旅游互聯網公司。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
