异步编程系列第01章 Async异步编程简介
p {
display: block;
margin: 3px 0 0 0;
}
-->
2016.10.11补充 三个月过去了,回头来看,我不得不承认这是一系列失败的翻译。过段时间,我将重新翻译。
在学异步,有位园友推荐了《async in C#5.0》,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚。
如果你觉得这件事儿没意义翻译的又差,尽情的踩吧。如果你觉得值得鼓励,感谢留下你的赞,祝各位爱技术的园友在今后每一次应该猛烈突破的时候,不选择知难而退。在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而为,不辜负每一秒存在的意义。
本文版权归博客园和作者吴双本人共同所有。 转载和爬虫请注明原文链接http://www.cnblogs.com/tdws/p/5617242.html,博客园 蜗牛 2016年6月26日。

异步编程
如果我们在一个耗时的操作中使用异步的代码,在其执行过程中,我们不需要无谓的等待。这种方式和在耗时操作的整个执行过程中的阻塞型代码是相对的。
我们所说的耗时操作包括:
·网络请求
·硬盘数据访问
·延迟一段时间的操作
全部的区别在于正在运行代码的线程。在广泛应用的编程语言当中,你的代码运行在操作系统的线程中。如果在遇到耗时操作时,你的线程可以继续去做其他事情,这就是异步编程。如果你的线程除了等待什么也不做,那就是同步的或者说是阻塞型代码。
当然我们还有第三种方式去处理耗时操作—轮询。这是一种不断重复“询问”耗时操作是否完成的操作。尽管它在处理段时间操作上有自己的地位,但这通常不是一个好的解决方案。
你也许在过去的工作中使用过异步编程。你可能开启一个新的线程或者使用线程池,这也是异步编程,因为你所工作的线程可以不被阻塞地去继续做其他事情。而你的console app,像Console.ReadLine(),这就是阻塞型,在web app中,如果也是这样的设计等待用户输入,将会是多么糟糕呀。
异步编程中很常见的难点在于这个操作在什么时候结束,以便于执行下一步的某些操作。但是这在阻塞型代码中,很容易做到:你只需要在将接下来的代码写在耗时操作的下一行就好。如果不加以处理,这种方式在异步的世界中是怎样也行不通的。因为几乎可以确定的是,你下一行代码是在耗时操作完成之前就已经执行了。
为了解决这个问题,我们发明了一些方式,为了在后台操作完成后去执行下一步操作:
·将下一步操作所需的代码插在耗时操作代码主体的后面
·注册一个当耗时操作结束时会触发的方法
·在完成后传递委托或者Lambad(回调)
如果你下一个操作需要在特定的线程上执行(例如Winform和WPF的UI线程),你还需要在这个线程上安排队列排序,这是很复杂的。
异步代码有什么了不起的?
异步编程释放了它开始的线程,这有许多原因确实不错。首先,线程占用并且占用很少的资源,通常只用一个线程就可以完成主要的工作,就像UI线程,但是如果你不尽快释放它,你的app就会出现未响应状态。我们将会讨论更多的原因在下一章。
最重要的,也是最令我激动的一点是:异步编程让我们得以有机会去尽情享受计算机并行计算带来的好处。异步编程让我们以新的并且合理的方式构建应用程序,用更细粒度的并行和无需编写难以维护的复杂代码。第十章将会详细探讨此可能性。
什么是异步编程?
在C#5.0当中,微软编译器团队为我们增加了一个强大的新功能。
它以两个新型关键字出现:。
·async
·await
它当然依赖于一些环境,要求你使用.NET FrameWork4.5,才能你的async代码有用。
Async是属于C#编译器的一个功能,不能被封装到一个类库,它对你的源代码进行改造,就像在早期C#版本对Lambda和迭代器所做的事情一样。
通过免去早期C#版本异步编程所需的复杂模式和代码,这个新功能使异步变得非常简单。有了这个功能,我们可以合理地用异步编程的风格编写整个项目。
异步编程一直在C#中是可行的的,它以前涉及编程者大量的手工工作,现在C#的async关键出现后,异步编程的使用变得非常容易。
异步编程Async做了什么?
Async功能提供了一种让你表达在耗时操作后需要做什么事情(执行什么代码)的方式,并且它易读易懂,表现为异步编程。
Async方法被编译器转化的像你平时所写的阻塞代码,这里有一段简单的下载网页的阻塞型代码:
private void DumpWebPage(string uri)
{
WebClient webClient = new WebClient();
string page = webClient.DownloadString(uri);
Console.WriteLine(page);
}
这里还有一段使用Async实现相同功能的代码:
private asyncvoid DumpWebPageAsync(string uri)
{
WebClient webClient = new WebClient();
string page = awaitwebClient.DownloadStringTaskAsync(uri);
Console.WriteLine(page);
}
两段代码在表面上看起来是非常相似的,但是在其外表下,有很大的不同。
被标记为Async的方法,要求方法使用await关键字,为了遵循惯例,我们也再方法的后缀名加上了Async。
有趣的地方是await关键字,当编译器遇到它时,他将方法分开(chop the method up),事实上它是很复杂的,所以现在我介绍一个我觉得更易于理解的简单情况的假结构。
1.await后所有的代码被分离到另一个方法。
2.我们使用一个新版本叫做DownloadStringTaskAsync的DownloadString方法,它做和原版相同的事情,但它是异步的。
3.这意味着我们可以给它新的第二种方法,即在它完成时它会调用。我们使用一些“魔法”来做这件事,稍后我会告诉你。
4.当下载结束,它将会把我们调用回来带着已经下载好的可以使用的string字符串,在这种情况下,写到控制台。
//这就是await分解的方法,上文所说的假的结构(译者博客园蜗牛注解)
private void DumpWebPageAsync(string uri)
{
WebClient webClient = new WebClient();
webClient.DownloadStringTaskAsync(uri)<- magic(SecondHalf); //魔力的方法调回来
}
private void SecondHalf(string awaitedResult)
{
string page = awaitedResult;
Console.WriteLine(page);
}
当它运行此代码时,调用线程会发生什么?当线程抵达DownloadStringTaskAsync方法,下载工作开始,但并不在此线程中执行,在这个线程上,我们抵达了方法的结尾或者说是return,这个线程下一步做什么由我们调用者来决定。如果是UI线程,它将会返回执行用户操作,除此外,它的资源将会被释放,这意味着我们在做异步编程!
异步编程并不能解决所有问题
异步代码被微软编译器开发团队尽可能设计的像你常写的阻塞(同步)代码,我们可以把耗时操作或者远程操作处理地像本地操作和快速。但是保持和异步调用一样的性能和优势。
然而,这样的设计不是让你忘记Async是后台操作还有发生回调。你需要小心很多事情,包括:
·异常和try-catch-finally模块
·方法的返回值
·线程和上下文
·性能
如果不了解它真正发生了什么,你的应用程序可能会意想不到的挂掉,并且你将无法理解异常信息和没有能力去解决问题。
终于翻译好了第一章,四页,花了几个小时。昨天读了一遍,没读懂,今天翻译一遍果然收获颇多。如果您表示支持,给个赞吧!继续阅读下一章 我们有什么理由使用Async异步编程
如果我的点滴分享对您有点低帮助,欢迎点击下方红色关注,我将持续分享,共同进步
异步编程系列第01章 Async异步编程简介的更多相关文章
- 【linux草鞋应用编程系列】_6_ 重定向和VT100编程
一.文件重定向 我们知道在linux shell 编程的时候,可以使用文件重定向功能,如下所示: [root@localhost pipe]# echo "hello world&q ...
- 异步编程系列第02章 你有什么理由使用Async异步编程
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- 异步编程系列第04章 编写Async方法
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- 异步编程系列第05章 Await究竟做了什么?
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- Linux/Unix系统编程手册 第三章:系统编程概念
本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...
- Scratch少儿编程系列:(十一)Scratch编程之简单见解
一.Scratch官网的说明 With Scratch, you can program your own interactive stories, games, and animations ...
- @Async异步注解与SpringBoot结合使用
当你在service层需要启动异步线程去执行某些分支任务,又不希望显式使用Thread等线程相关类,只想专注于实现业务逻辑代码开发,可以使用@Async异步注解. 1. 使用@Async 异步注解 C ...
- 16第一章 ASP.Net编程基础知识
第一章 ASP.Net编程基础知识 第一章 ASP.Net编程基础知识 本章首先介绍用ASP.Net技术编制服务器端动态网页所需的网络和HTML标记语言方面的有关知识.然后 ...
- 异步编程系列06章 以Task为基础的异步模式(TAP)
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
随机推荐
- 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- Collection集合
一些关于集合内部算法可以查阅这篇文章<容器类总结>. (Abstract+) Collection 子类:List,Queue,Set 增: add(E):boolean addAll(C ...
- 我理解的MVC
前言 前一阶段对MVC模式及其衍生模式做了一番比较深入的研究和实践,这篇文章也算是一个阶段性的回顾和总结. 经典MVC模式 经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的 ...
- Javascript学习笔记
Javascript 2016年12月19日整理 JS基础 Chapter1 JS是一门运行在浏览器客户端的脚本编程语言,前台语言 组成部分 1. ECMAscript JS标准 2. DOM 通过J ...
- SAP CRM 性能小技巧
导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...
- 中国CIO最关心的八大问题(上)
中国CIO最关心的八大问题(上) 近期,ITValue和ValueResearch联合展开<IT决策者投资与生存状态大调查>,调查范围从关注CIO本身,延展至关注CIO所供职企业--其赖以 ...
- 手机游戏渠道SDK接入工具项目分享(二)万事开头难
一般接到任务后程序员们通常都开始着手进行技术调研了,但我这活是项目负责人.还有一大堆事情要先期准备,没人能帮忙. 一.人力配置 考虑的之前已经有一波人搞了大半年,但没有起色,先期也没有太大人力需求,所 ...
- JAVA设计模式之模板模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...
- 浅析SQL查询语句未显式指定排序方式,无法保证同样的查询每次排序结果都一致的原因
本文出处:http://www.cnblogs.com/wy123/p/6189100.html 标题有点拗口,来源于一个开发人员遇到的实际问题 先抛出问题:一个查询没有明确指定排序方式,那么,第二次 ...
- ubuntu安装ANSYS17.2全过程
本次介绍在Ubuntu kylin1604下安装Ansys 17.2的全部过程. 1 安装文件准备 关于ANSYS的软件安装文件,在网络上可以找到.这里采用SSQ版本的安装文件,如图所示,包含一个名为 ...