Async await 异步编程说明
? 希望在編程上有些許提高所以 最近連續2篇博客都在說明多線程和異步編程的使用,異步和多線程之間區別請自行百度,因為理解不是特別透徹就不在敘述以免誤導大家,這里寫下新研究整理 task ?和 await 的異步編程使用
調用子方法和耗時方法如下
/// <summary>/// 有返回值異步方法/// </summary>/// <returns></returns>static async Task<int> HaveReturnAsync(){await Task.Run(() => Method1("HaveReturnAsync")); // part_001//Task t1 = new Task(() => sss());//t1.Start();Console.WriteLine("ccc"); //part_003return 10;}/// <summary>/// 耗時輸出方法/// </summary>/// <param name="name"></param>static void Method1(string name){string temp1 = ""+name+"_1";string temp2 = "" + name + "_2";Console.WriteLine(temp1);Thread.Sleep(500);Console.WriteLine(temp2);}調用主方法
//無返回值//Async2();//Console.WriteLine("Async2-Bakc"); // 有返回值var ll = HaveReturnAsync(); Console.WriteLine("aaa"); //part_002Console.WriteLine("llValue:" + ll.Result); // part_003Console.ReadKey();執行結果
從執行結果可以看出在執行HaveReturnAsync:async Task<int> HaveReturnAsync() ? 主線程不會等待會直接輸出//part_002?,但在HaveReturnAsync() 方法體內 會等待?Method1 方法執行完
再輸出?Console.WriteLine("ccc"); //part_003,看到這里大家會對 await 有一定了解了吧,從整體來看 主線程 調用HaveReturnAsync 是異步,在HaveReturnAsync() 方法體內 調用?Method1 用await 使其會等待Method1?執行完后
,再執行下面代碼是同步。
一個async方法里通常包含一個或多個的對應的await操作符,但如果沒有await表達式也不會導致編譯錯誤。但如果調用一個async方 法,卻不使用await關鍵字來標記一個掛起點的話,程序將會忽略async關鍵字并以同步的方式執行
?
******** 2019-06-25 補充 var ll = HaveReturnAsync(); 類似執行耗時方法多個時 **先不加 awaitConsole.WriteLine("aaa"); //part_002Console.WriteLine("llValue:" + await ll) 這個時候加 await 等待 多個結果如果有多個耗時方法時 這樣就可以節省時間?
總結
?1.一個異步方法的聲明中必然包含一個async的修飾符。
?2.異步方法的方法名可以以“Async”結尾。
?3.Task<TResult> 當你的方法有返回值時,那么TResult即返回值的類型
?4.方法通常至少包含一個await表達式。
5.?建議使用await,.Result容易造成死鎖。
await 時是釋放線程,線程能去執行其它任務;.Result 就是讓線程暫停,等待結果
6? Web 服務器的可用線程是有限的,而在高負載情況下的可能所有線程都被占用。 當發生這種情況的時候,服務器就無法處理新請求,直到線程被釋放。 使用同步代碼時,可能會出現多個線程被占用但不能執行任何操作的情況,因為它們正在等待 I/O 完成。 使用異步代碼時,當進程正在等待 I/O 完成,服務器可以將其線程釋放用于處理其他請求。 因此,異步代碼可以使服務器資源能夠更有效地使用和服務器能夠處理更多流量不會延遲。
?
希望上面描述對大家對異步編程有初步了解,如有疑問可以一起討論。
?
轉載于:https://www.cnblogs.com/liyanbofly/p/7919677.html
總結
以上是生活随笔為你收集整理的Async await 异步编程说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互评Beta版本
- 下一篇: pycharm pull到github