什么是异步?

作为一名Web端的码农,第一次接触异步是Ajax。

异步请求后端获取数据源,js操作html的dom节点,而无需要渲染整个网页的操作。

页面上点击按钮,加载进度动画,同时发起Ajax请求数据源,用户观看加载动画。在拿到数据后,中止动画,开始渲染数据。用户可以查看到数据内容。

动画渲染和请求数据两个任务,同时进行,就是异步。

什么是异步编程?

一个函数内做2件或者几件事。(例如:点击按钮加载动画的同时处理数据。)

很多同学有疑问,一个函数内做2件或者几件事,不就是多线程编程么。怎么又出来个异步编程的名词?

我们来看代码:

主线程会创建一个新的线程t,新的线程重复输出B。同时,主线程也会重复的输出A。但是可以发现在控制台,输出的A和B不是连续的,这是由于线程是抢占式的,它的执行和其它线程的代码是交错执行的。

C#异步编程的基础类型是 Task,通过关键字  asyncawait 来快速实现。(早年还有APM、EAP)

task 单词翻译是任务,是Framework 4.0 时,作为并行编程库的组成部分引入的。相比较 Thread 线程,任务的概念是个更高级的抽象概念。它代表一个并发操作,但是本身又不操作线程,也不一定依赖线程来完成。

比如:线程就像一个个快递员,线程池就是快递公司。任务,就是自己把想要的东西打包起来,交给快递公司,让快递公司去处理,交给快递员去运输。

Task 默认使用线程池中的线程,它们都是后台线程。意味着当主线程结束时,所有的任务也会随之终止。

在如上图的代码中,利用 Task.Run 运行了一个Task,但是控制台并没有打印。

添加 Console.ReadLine(); 避免主线程结束,就会执行 Task 。要想 Task 顺利完成,就要想办法避免主线程的结束,Task 开启后可以返回一个对象,可以用 Wait  等待

Task 还没进行完的时候,告诉主线程,“嘿,老兄,我还没好”。

Task 对象还有很多属性,这里就不介绍了。

要想编写异步函数,可将返回类型由 void 更改为 Task,如有返回值,Task<T>。

Task.Delay(1000); 等待1000毫秒后再执行。

等待1秒后,输出1000个A,再等待1秒后,输出1000个B。然后结束主线程,退出当前程序。

这样就不会出现多线程执行当中的交错执行和相互抢占。

参考资料《C# 7.0 核心技术指南

C#中的异步的更多相关文章

  1. ASP.NET MVC EF 中使用异步控制器

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   为什么使用异步操作/线程池 ASP.NET MVC ...

  2. NodeJS中的异步I/O、事件驱动

    nodejs的主要特点是单线程.异步I/O.事件驱动.让我们先大概了解一下这些名词的意思. 单线程 单线程是任务按照顺序执行的,并且每次只执行一个任务,只有前面的任务执行完成以后,后面的任务才执行.在 ...

  3. C#中的线程一(委托中的异步)

    C#中的线程一(委托中的异步) 一.同步委托 我们平时所用的委托以同步居多,我们编写一个方法和相关委托进行演示: publicdelegatevoid DoSomethingDelegate(stri ...

  4. 看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?

    转载自博客园:http://farb.cnblogs.com/ 今天无意中看到stackoverflow上一个很好的问答,个人觉得很有价值,所以翻译过来和大家共享!希望大家能相互交流. 在ASP.NE ...

  5. .Net中的异步编程总结

    一直以来很想梳理下我在开发过程中使用异步编程的心得和体会,但是由于我是APM异步编程模式的死忠,当TAP模式和TPL模式出现的时候我并未真正的去接纳这两种模式,所以导致我一直没有花太多心思去整理这两部 ...

  6. 如何在单元测试中测试异步函数,block回调这种

    大概有四种方法: runloop 阻塞主进程等待结果 semphaore 阻塞主进程等待结果 使用XCTestExpectation 阻塞主线程等待(我用这个,xcode自带的,为啥不用) 使用第三方 ...

  7. Delphi中ADO异步执行方式

    当ADO开始处理数据后,应用程序必须等到ADO处理完毕之后才可以继续执行.但是除了同步执行方式之外,ADO也提供了异步执行的方式,允许当ADO处理时,应用程序仍然能够先继续执行.而当ADO处理数据完毕 ...

  8. Android中AsyncTask异步

    今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...

  9. HttpApplication中的异步线程

    一.Asp.net中的线程池设置 在Asp.net的服务处理中,每当服务器收到一个请求,HttpRuntime将从HttpApplication池中获取一个HttpApplication对象处理此请求 ...

  10. PHP中实现异步调用多线程程序代码

    本文章详细的介绍了关于PHP中实现异步调用多线程方法,下面我们以给1000个用户发送一封推荐邮件,用户输入或者导入邮件账号了提交服务器执行发送来讲述. 比如现在有一个场景,给1000个用户发送一封推荐 ...

随机推荐

  1. windows环境下基于pycharm安装Redis出现的两个错误解决方案

    说明:下面给出的两个链接是解决安装和使用Redis的时候遇到的两个问题参考的博客网址,本文有解释不清楚的地方可以原博客查看,侵权删! Q1参考链接-https://blog.csdn.net/maqu ...

  2. 【Java虚拟机3】类加载器

    前言 Java虚拟机设计团队有意把类加载阶段中的"通过一个类的全限定名来获取描述该类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类. ...

  3. Java:ConcurrentHashMap类小记-3(JDK8)

    Java:ConcurrentHashMap类小记-3(JDK8) 结构说明 // 所有数据都存在table中, 只有当第一次插入时才会被加载,扩容时总是以2的倍数进行 transient volat ...

  4. mybatis中的#和$的区别 以及 防止sql注入

    声明:这是转载的. mybatis中的#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sq ...

  5. 设计的MOS管三极管简单开关电路驱动能力不够2

    设计的MOS管三极管简单开关电路驱动能力不够 [复制链接]     lxizj 9 主题 454 帖子 1783 积分 四级会员(40) 积分 1783 发消息 16#   发表于 2012-4-23 ...

  6. Spring:所有依赖项注入的类型

    一.前言 Spring文档严格只定义了两种类型的注入:构造函数注入和setter注入.但是,还有更多的方式来注入依赖项,例如字段注入,查找方法注入.下面主要是讲使用Spring框架时可能发生的类型. ...

  7. DeWeb和WebXone的区别

    DeWeb和WebXone的区别 相同点: 1 两者为同一开发者研发.QQ:45300355,碧树西风 2 都是为了解决Delphi开发Web的问题 区别: 1 WebXone采用的ActiveX/N ...

  8. 一、安装zabbix监控(源码编方式)

    首先介绍一下zabbix的运行原理和运行条件. Zabbix监控原理 Zabbix 通过C/S 模式采集数据,通过B/S模式在web 端展示和配置.  被监控端:主机通过安装agent 方式采集数据, ...

  9. php linux yaml 的安装和使用

    安装: 1 下载yaml包 wget http://pyyaml.org/download/libyaml/yaml-0.2.2.tar.gz tar -zxvf yaml-0.2.2.tar.gz ...

  10. robotframework-ride快捷方式打不开

    我安装的是最新的RIDE2.0属于beta测试中,覆盖了3.8但仍不支持3.9 我的安装环境如下: 安装ride成功,启动ride的时候遇到了如下问题: 一:AttributeError: No at ...