什么是异步?

作为一名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 核心技术指南

最新文章

  1. 解决springmvc报No converter found for return value of type: class java.util.ArrayList问题
  2. .NET 反射的使用
  3. Openjudge计算概论-角谷猜想
  4. 【转】eclipse技巧1
  5. Socket 两平台互相 通信 .NET
  6. mysql主配置文件my.cnf详细说明
  7. Unity3d shader之SWAP Force Depth-of-Field Shader
  8. lucene3.6.0 经典案例 入门教程
  9. strlen源码剖析
  10. swift3.0 底部弹出菜单 UIAlertController的使用
  11. Java面试题合集(一)
  12. asp.net core 系列 2 启动Startup类介绍
  13. jacoco统计server端功能测试覆盖率
  14. 为什么notify(), wait()等函数定义在Object中,而不是Thread中
  15. js执行上下文
  16. 《剑指offer》第六十八题(树中两个结点的最低公共祖先)
  17. 关于malloc(0)的返回值问题--这两天的总结与实践篇
  18. 【Hibernate步步为营】--最后的集合映射
  19. C#中数组数据类型字符串转double型问题
  20. Unity3d中使用Lua

热门文章

  1. javascript-jquery的基本方法
  2. FastAPI 学习之路(三十八)Static Files
  3. 【UE4 设计模式】组件模式 Components Pattern
  4. Vite启动后提示Network: use `--host` to expose
  5. 防止SQL注入总结
  6. SpringCloud微服务实战——搭建企业级开发框架(七):自定义通用响应消息及统一异常处理
  7. 2021.8.11考试总结[NOIP模拟36]
  8. 计算机网络之网络层移动IP
  9. 矩形覆盖 牛客网 剑指Offer
  10. Python打包成exe可执行文件