Async await 异步编程说明
? 希望在編程上有些許提高所以 最近連續(xù)2篇博客都在說(shuō)明多線程和異步編程的使用,異步和多線程之間區(qū)別請(qǐng)自行百度,因?yàn)槔斫獠皇翘貏e透徹就不在敘述以免誤導(dǎo)大家,這里寫(xiě)下新研究整理 task ?和 await 的異步編程使用
調(diào)用子方法和耗時(shí)方法如下
/// <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>/// 耗時(shí)輸出方法/// </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);}調(diào)用主方法
//無(wú)返回值//Async2();//Console.WriteLine("Async2-Bakc"); // 有返回值var ll = HaveReturnAsync(); Console.WriteLine("aaa"); //part_002Console.WriteLine("llValue:" + ll.Result); // part_003Console.ReadKey();執(zhí)行結(jié)果
從執(zhí)行結(jié)果可以看出在執(zhí)行HaveReturnAsync:async Task<int> HaveReturnAsync() ? 主線程不會(huì)等待會(huì)直接輸出//part_002?,但在HaveReturnAsync() 方法體內(nèi) 會(huì)等待?Method1 方法執(zhí)行完
再輸出?Console.WriteLine("ccc"); //part_003,看到這里大家會(huì)對(duì) await 有一定了解了吧,從整體來(lái)看 主線程 調(diào)用HaveReturnAsync 是異步,在HaveReturnAsync() 方法體內(nèi) 調(diào)用?Method1 用await 使其會(huì)等待Method1?執(zhí)行完后
,再執(zhí)行下面代碼是同步。
一個(gè)async方法里通常包含一個(gè)或多個(gè)的對(duì)應(yīng)的await操作符,但如果沒(méi)有await表達(dá)式也不會(huì)導(dǎo)致編譯錯(cuò)誤。但如果調(diào)用一個(gè)async方 法,卻不使用await關(guān)鍵字來(lái)標(biāo)記一個(gè)掛起點(diǎn)的話,程序?qū)?huì)忽略async關(guān)鍵字并以同步的方式執(zhí)行
?
******** 2019-06-25 補(bǔ)充 var ll = HaveReturnAsync(); 類似執(zhí)行耗時(shí)方法多個(gè)時(shí) **先不加 awaitConsole.WriteLine("aaa"); //part_002Console.WriteLine("llValue:" + await ll) 這個(gè)時(shí)候加 await 等待 多個(gè)結(jié)果如果有多個(gè)耗時(shí)方法時(shí) 這樣就可以節(jié)省時(shí)間?
總結(jié)
?1.一個(gè)異步方法的聲明中必然包含一個(gè)async的修飾符。
?2.異步方法的方法名可以以“Async”結(jié)尾。
?3.Task<TResult> 當(dāng)你的方法有返回值時(shí),那么TResult即返回值的類型
?4.方法通常至少包含一個(gè)await表達(dá)式。
5.?建議使用await,.Result容易造成死鎖。
await 時(shí)是釋放線程,線程能去執(zhí)行其它任務(wù);.Result 就是讓線程暫停,等待結(jié)果
6? Web 服務(wù)器的可用線程是有限的,而在高負(fù)載情況下的可能所有線程都被占用。 當(dāng)發(fā)生這種情況的時(shí)候,服務(wù)器就無(wú)法處理新請(qǐng)求,直到線程被釋放。 使用同步代碼時(shí),可能會(huì)出現(xiàn)多個(gè)線程被占用但不能執(zhí)行任何操作的情況,因?yàn)樗鼈冋诘却?I/O 完成。 使用異步代碼時(shí),當(dāng)進(jìn)程正在等待 I/O 完成,服務(wù)器可以將其線程釋放用于處理其他請(qǐng)求。 因此,異步代碼可以使服務(wù)器資源能夠更有效地使用和服務(wù)器能夠處理更多流量不會(huì)延遲。
?
希望上面描述對(duì)大家對(duì)異步編程有初步了解,如有疑問(wèn)可以一起討論。
?
轉(zhuǎn)載于:https://www.cnblogs.com/liyanbofly/p/7919677.html
總結(jié)
以上是生活随笔為你收集整理的Async await 异步编程说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 互评Beta版本
- 下一篇: pycharm pull到github