让咱异步重新编程异步C#。

本文版权归博客园和作者吴双本人并持有。转载以及爬虫必须以显要位置注明出处:http://www.cnblogs.com/tdws

一半年前译了同密密麻麻非常糟糕之异步编程文章,用异步的常用语来说:”在明天的某时刻“
我还会另行翻Async in
C#5.0 http://www.cnblogs.com/tdws/p/5617242.html

 写在头里 

  

     
 异步编程在处理并发方面吃运用的越来越多,之所以说点一样词话,是以区别多线程编程。各位驾驶员还明白,实际上异步编程的基本目标正出现处理。可要不时来一些被人口深感分外无奈之说教同问题,比如说,异步编程能增高使用性也?他能缩短我处理任务之时日也?他死线程吗?如果未打断线程,断点为什么未累往下实施,我之哥哥!线程释放及何处去矣?我还读少你变骗我,线程都放了程序怎么运作?前台我为此了Ajax,后台使用Async有必不可少为?也许要作为司机的而盼最后一个题材,你只能摊手┑( ̄Д
 ̄)┍。

 多线程场景理解

恐在某些时刻,你想增强应用程序执行进度,尽快以到一个结果。这个上,应该选择的绝免是Async和Task。打只假设说,你及公女人周末错过超市购物,刚一进超市门而发现结账的各级条队伍都几十人数,于是你用到了差不多线程,你错过排队,一个口一个口之向前头挪,你太太在另外一头赶紧购物,在你赶快走及竣工银台的时节,你女人来管购物车推给了若,于是你们一直结账回家。虽然这种表现很不文明,但立刻就是是多线程,和异步编程一点关系还未曾。

 

 异步编程场景理解

这就是说异步编程是什么状态,能化解什么问题呢?你和你女人开了一如既往寒面包店,在前期只有你俩为消费者服务。没悟出新店开张这么火,每分钟来一个顾客,而烤好同一客面包需要简单分钟。每来同样各消费者若都用在一片面包去晚厨烤箱烤,并且你要和而老婆如果花鲜分钟来等个别的烤箱完成任务。可是你等的即刻有限分钟,又来了个别位消费者,着这样的速度下去,根本无可知满足消费者们的需要呀!你曾经意识而跟汝女人的问题了:那即便是您同您太太就片久线程,都于烤箱花费的工夫阻塞了!

君跟汝太太为缓解阻塞的题材,又买了少数玉烤箱,并且为避免新进顾客没有人劳动,每当你把面包送上烤箱后,标记其属于哪个顾客后这回,准备接待新的客,再出顾客光顾,立马接待,并拿新的面包送上任何一个烤箱并记,并随即赶回等待也其他人服务。在面包烤好后,烤箱会以“叮”一望,注意在即时无异于信号到晚,并无是毫无疑问要是而去晚厨烤箱取面包,而是你同您老婆谁不忙谁去取。这样处理后,高并发的顾客量,对你吧就是显示得心应手了。你同您女人做啊片长线程,可以不断地以非阻塞的款型(不等烤箱),返回到买主面前。但是要专注的凡匪封堵的概念,他未是受你的顺序继续朝着下实施。就烤面包而言你的一个烤面包方法是这么的:

1.送入面包到烤箱 2.烤箱处理面包并于您结果
3.拿到面包送至消费者。所以说“不死”的定义,不克吃您一直就第三步。在非死期间,是未曾线程在您的之方式中之,这个方法还是要是以时间待,等待以未来某个时刻的信号提醒你要么你太太,此时该方式恢复执行。所以说程序执行的时刻依然未变换,得到优化的凡拍卖并发的能力,你店里(服务器)的吞吐量。

 看正在代码理解

 异步编程该于适用于IO密集型场景,非CPU计算密集场景。大家清楚线程受CPU调度,如果您是四复核CPU,那么在你的线程池中,拥有四独线程,进程每个虚拟CPU分配一个线程的当儿,性能表现会太巧。既会迅速使用CPU,又毫不来回切换上下文损耗性能。你思考,CPU密集的状况被,CPU就是如果占用而的线程,在此时刻异步编程没有另外用处。然而当IO场景中,文件IO由win32用户模式之API到windows内核模式,在根本模式被操作磁盘驱动程序。这中,你的线程阻塞在驱动程序的应中。而异步编程中,你的操作通知到磁盘驱动程序后,线程立即赶回而未等待,在将来底有时刻,驱动程序处理终结,处理结果放入CLR线程池队列中,恢复状态机,线程池中任意线程取出结果,方法继续朝下执行。在网IO中为是这般,只不过驱动程序变成了网驱动程序。请看如下代码:

public static async Task<string> DoSomeAsync()
        {
            using (var client = new HttpClient())
            {
                var result = await client.GetAsync(
                    "http://stackoverflow.com/questions/37991851/jenkins-configure-page-not-loading-version1-651-3-chrome-browser")
                    .Result.Content.ReadAsStringAsync();
                Console.WriteLine(result);
                //做一些其他操作
                var res = 1 + 1;
                //----------------
                return "";
            }
        }

每当编译的时候,DosomeAsync会叫编译成一个态机方法,状态机是呀先转移无,你可以把它当成一个地下盒子。在遇到GetAsync的时,在DoSomeAsync中回到一个Task任务目标,并由await在Task对象及传递用于恢复状态机的计,相当给调用了ContinueWith().这个措施顾名思义,以xxx继续。然后线程从DoSomeAsync中归。返回后提到嘛去矣?该线程可以去处理外作业了。在未来有平等天天,服务器向我们发送了一个相应,网络驱动程序得知要了,恢复该法继续执行剩下的其余代码。配一张乱糟糟的希冀

 

 额外之好处

 在GC的垃圾堆清理实施过程被,应用程序的拥有线程都见面被吊于,使用异步编程意味着当同样的连发量下,你可采取重复不见的线程来成功处理,额外带来的便宜虽,所欲清理的线程是双重不见的。还有一些哪怕是,所采取的线程少了,CPU线程切换为移得重复不见。

 

若是本身的简单分享对君有接触滴帮助,欢迎点击下方红色按钮关注,我用不断输出分享。也接呢自我啊也卿协调沾赞。

正文关键字,C# ASP.NET 异步编程 MVC Async await

相关文章