C#让大家再为C#异步编程Async正名

本文版权归知乎和作者吴双本人共同持有。转载和爬虫必须在显要地方表明出处:http://www.cnblogs.com/tdws

半年前翻译了一多重很不好的异步编程随笔,用异步的常用语来说:”在将来的某部时刻“
我还会再也翻译Async in
C#5.0 http://www.cnblogs.com/tdws/p/5617242.html

 写在前头 

  C# 1

     
 异步编程在处理并发方面被使用的进一步多,之所以说地方一句话,是为了区别多线程编程。各位驾驶员都理解,实际上异步编程的主旨目的正出现处理。可仍旧时常有部分令人倍感很不得已的传道和问题,比如说,异步编程能增强使用性能吗?他能缩短我处理任务的时刻吧?他围堵线程吗?假如不封堵线程,断点为啥不连续向下执行,我的哥!线程释放到哪儿去了?我都读书少你别骗我,线程都释放了程序怎么运作?前台我用了Ajax,后台使用Async有必要吗?也许要是作为司机的您看到最后一个题目,你只可以摊手┑( ̄Д
 ̄)┍。

 多线程场景通晓

C# 2想必在某些时刻,你想增强应用程序执行进度,尽快得到一个结实。这些时候,应该采用的绝对不是Async和Task。打个比方说,你和你太太周末去超市购物,刚一进超市门你发现结账的每条队伍容貌都几十人,于是你用到了多线程,你去排队,一个人一个人的往前走,你太太在另一头赶紧购物,在您快走到收银台的时候,你妻子来把购物车推给了您,于是你们一向结账回家。即使这种作为很不文明,但那就是多线程,和异步编程一点关联都尚未。

 

 异步编程场景通晓

C# 3这异步编程是什么样动静,能解决什么问题呢?你和您老婆开了一家面包店,在最初唯有你俩为买主服务。没悟出新店开张这么火,每分钟来一个消费者,而烤好一份面包需要两分钟。每来一位消费者你都拿着一片面包去后厨烤箱烤,并且你要和您妻子要花两分钟来等分此外烤箱完成任务。不过你等待的这两分钟,又来了两位顾客,着如此的进度下去,根本不能够满意消费者们的急需呀!你已经意识你和您老婆的题目了:这就是您和您妻子这两条线程,都被烤箱花费的流年阻塞了!

C# 4你和您太太为了化解阻塞的问题,又买了两台烤箱,并且为了避免新进买主没人服务,每当你把面包送进烤箱后,标记其属于哪位顾客后即时赶回,准备接待新的消费者,再有顾客光临,立马接待,并将新的面包送进另一个烤箱并标记,并当即重返等待为其外人服务。在面包烤好后,烤箱会以“叮”一声,注目的在于这一信号到达后,并不是早晚要你去后厨烤箱取面包,而是你和您太太何人不忙哪个人去取。这样处理后,高并发的顾客量,对您的话就显示一箭穿心了。你和您太太做为两条线程,可以不断地以非阻塞的款型(不等烤箱),重回到消费者面前。可是急需注意的是不打断的概念,他不是让你的程序继续向下进行。就烤面包而言你的一个烤面包方法是这么的:

1.送入面包到烤箱 2.烤箱处理面包并给你结果
3.得到面包送到买主。所以说“不封堵”的概念,不可能让你向来到位第三步。在不打断期间,是未曾线程在您的这一个办法中的,这些办法如故要按部就班时间等待,等待在以后某个时刻的信号指示你依然您太太,此时该方法恢复生机执行。所以说程序执行的时间依然不变,拿到优化的是处理并发的能力,你店里(服务器)的吞吐量。C# 5

 看着代码了解

 异步编程应当被适用于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中回到。重返后干嘛去了?该线程可以去处理任何作业了。在将来某一随时,服务器向我们发送了一个遥相呼应,网络驱动程序得知请求完毕,復苏该方法继续执行剩下的其它代码。配一张乱糟糟的图

C# 6

 

 额外的功利

 在GC的废料清理实施进程中,应用程序的富无线程都会被挂起,使用异步编程意味着在相同的并发量下,你可以选用更少的线程来成功处理,额外带来的益处就是,所急需清理的线程是更少的。还有少数就是,所运用的线程少了,CPU线程切换也变得更少。

 

一旦本身的点滴分享对您有点滴帮助,欢迎点击下方青色按钮关注,我将不断输出分享。也欢迎为我也为您自己点赞。

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

相关文章