net异步编程之await
Posted Leo_wlCnBlogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了net异步编程之await相关的知识,希望对你有一定的参考价值。
终于毕业了,也顺利进入一家期望的旅游互联网公司。27号入职。放肆了一个多月没写代码,好方啊。
另外一下观点均主要针对于await.
*问题1:await会让当前线程一直等待吗?await等待的时间中一直占用线程资源吗?
*问题2:等待await数据返回交给等待线程再继续向下执行吗?
*问题3:向await下一条语句执行的线程,是执行await的线程吗?
*问题1:异步编程可以让程序变快吗?
*问题2:异步编程执行耗时计算有用吗?
*问题3:既然异步编程执行顺序和同步相同,那么其意义何在?
class Program { static void Main(string[] args) { 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(); } } }
异步编程特别适用于网络操作,因为网络操作发起请求之后等待它完成就行,所以这时候执行到这的线程,可以释放并会到线程池中,网络操作执行完成之后,再从线程池中随机拿一个线程继续执行。
最后的补充:刚才讨论的是await的作用。之所以如上测试代码能够按照同步的过程来执行,是await的作用。比如我们在FirstTask中不等待SecondTask的结果时,那么执行顺序是会改变的,6会提前输出出来。这是async的作用,不阻塞线程。我个人认为,在不需要await结果的情况下,async是可以减少执行时间的。