第十节:利用async和await简化异步编程模式的几种写法
一. async和await简介
PS:简介
1. async和await这两个关键字是为了简化异步编程模型而诞生的,使的异步编程更简洁,它本身并不创建新线程,但在该方法内部开启多线程,则另算。
2. 这两个关键字适用于处理一些文件IO操作。
3. 好处:代码简介,把异步的代码写成了同步的形式,提高了开发效率。
坏处:如果使用同步思维去理解,容易出问题,返回值对不上。
二. 几种用法
情况1:当只有async,没有await时,方法会有个警告,和普通的多线程方法没有什么区别,不存在线程等待的问题。
代码实践:
1 private static async void Test1()2 {3 //主线程执行4 Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId);5 //启动新线程完成任务6 Task task = Task.Run(() =>7 {8 Console.WriteLine("子线程{0}开始:", Thread.CurrentThread.ManagedThreadId);9 Thread.Sleep(3000);
10 Console.WriteLine("子线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
11 });
12 //主线程执行
13 Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
14 }
代码结果:
情况2:不推荐void返回值,使用Task来代替Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用,async Void 不行。
代码实践:
1 /// <summary>2 /// 不推荐void返回值,使用Task来代替3 /// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用。async Void 不行4 /// </summary>5 private static async void Test2()6 {7 //主线程执行8 Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId);9 //启动新线程完成任务
10 Task task = Task.Run(() =>
11 {
12 Console.WriteLine("子线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
13 Thread.Sleep(3000);
14 Console.WriteLine("子线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
15 });
16 await task; //等待子线程执行完毕,方可执行后面的语句
17 Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
18 }
代码结果:
情况3:async Task == async void。 区别:Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用,async Void 不行。
代码实践:
1 /// <summary>2 /// 无返回值 async Task == async void3 /// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用,async Void 不行4 /// </summary>5 private static async Task Test3()6 {7 //主线程执行8 Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId);9 //启动新线程完成任务
10 Task task = Task.Run(() =>
11 {
12 Console.WriteLine("子线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
13 Thread.Sleep(3000);
14 Console.WriteLine("子线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
15 });
16 await task; //等待子线程执行完毕,方可执行后面的语句
17 Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
18 }
代码结果:
情况4和情况5:说明要使用子线程中的变量,一定要等子线程执行结束后再使用。
代码实践:
1 /// <summary>
2 /// 带返回值的Task,要使用返回值,一定要等子线程计算完毕才行
3 /// </summary>
4 /// <returns></returns>
5 private static async Task<long> Test4()
6 {
7 //主线程执行
8 Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
9 long result = 0;
10 //启动新线程完成任务
11 Task task = Task.Run(() =>
12 {
13 for (long i = 0; i < 100; i++)
14 {
15 result += i;
16 }
17 });
18 await task; //等待子线程执行完毕,方可执行后面的语句
19 Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
20 Console.WriteLine("result:{0}", result);
21 return result;
22 }
1 /// <summary>2 /// 带返回值的Task,要使用返回值,一定要等子线程计算完毕才行3 /// 与情况四形成对比,没有等待,最终结果不准确4 /// </summary>5 /// <returns></returns>6 private static Task<long> Test5()7 {8 //主线程执行9 Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
10 long result = 0;
11 //启动新线程完成任务
12 TaskFactory taskFactory = new TaskFactory();
13 Task<long> task = taskFactory.StartNew<long>(() =>
14 {
15 for (long i = 0; i < 100; i++)
16 {
17 result += i;
18 }
19 return 1;
20 });
21 Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
22 Console.WriteLine("result:{0}", result);
23 return task;
24 }
代码结果:
以上两种情况,第一种情况含有线程等待的结果为4950,第二个情况么有线程等待,结果不准确(即共享变量竞用问题)。
第十节:利用async和await简化异步编程模式的几种写法相关推荐
- 利用 async amp; await 的异步编程
一.异步编程的简介 通过使用异步编程,你可以避免性能瓶颈并增强应用程序的总体响应能力. Visual Studio 2012 引入了一个简化的方法,异步编程,在 .NET Framework 4.5 ...
- 使用 Async 和 Await 的异步编程
来自:http://msdn.microsoft.com/library/vstudio/hh191443 异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要. 对 Web 资源的访 ...
- async 和 await 之异步编程的学习
async修改一个方法,表示其为异步方法.而await表示等待一个异步任务的执行.js方面,在es7中开始得以支持:而.net在c#5.0开始支持.本文章将分别简单介绍他们在js和.net中的基本用法 ...
- 第十节 利用Quartz实现数据库定时备份
svbadmin学习日志 本学习日志是使用Springboot和Vue来搭建的后台管理系统: 演示地址:http://118.31.68.110:8081/index.html 账号:root 密码: ...
- Atitit. Async await 优缺点 异步编程的原理and实现 java c# php
Atitit. Async await 优缺点 异步编程的原理and实现 java c# php 1. async & await的来源1 2. 异步编程history1 2.1. 线程池 2 ...
- 使用 Task 简化异步编程
.Net 传统异步编程概述 .NET Framework 提供以下两种执行 I/O 绑定和计算绑定异步操作的标准模式: 异步编程模型 (APM),在该模型中异步操作由一对 Begin/End 方法(如 ...
- Async和Await如何简化异步编程几个实例
引言 C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作,下面就具体看看编译器到底在背后帮我们做了哪些复杂的工作的. 同步代码存 ...
- 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题
async await 解决异步问题,这两个关键字是es7提出的,所以测试,node和浏览器版本提高一些 async await 操作基于promise实现的 async await这两个关键字是一起 ...
- JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式!...
此篇是 JavaScript是如何工作的第四篇,其它三篇可以看这里: JavaScript是如何工作的:引擎,运行时和调用堆栈的概述! JavaScript是如何工作的:深入V8引擎&编写优化 ...
最新文章
- java 引用传递_详解java的值传递、地址传递、引用传递
- 泰一指尚大数据应用成为第一批省级重点企业研究院
- .netcore2.0 发布CentOS7
- 无法联系上证书的吊销服务器,CA服务器搭建问题,日志分析---吊销功能无法检查证书的吊销...
- 如何使用Windows搜索在任何文件中搜索文本
- zookeeper集群部署监控与选举同步流程等工作原理
- HTML5 实现离线数据缓存
- 10.15 lzxkj
- WBOLT热门关键词推荐插件v1.3.0 Pro 绿色版
- python读取pcap获得端口_Python处理网络数据包示例(pcapy读pcap文件)
- 手机输入法带拼音声调_最好用的输入法,百度输入法带你体验更智能的拼音输入法...
- 用python在大麦网抢票攻略_大麦网抢票有什么攻略?
- 使用计算机粘贴板的步骤,教你查看win7电脑的剪切板使用技巧和位置查看的方法...
- 【C语言】字符串数组按字典升序
- Angular Router的组件路由介绍
- gif制作方法教学,教你快速上手制作gif动图
- 陈艾盐:《春燕》百集访谈节目第三十七集
- 橘子树拍击弦贝司音源 Orange Tree Samples CoreBass Cherry Slapped
- Java神操作之SpringBoot基础上添加Kotlin混合开发
- android sqlite 存储对象,SQLite存储对象
热门文章
- android adb shell常用命令(四)
- 面向对象:包装类、对象处理、类成员
- MYSQL 在当前时间加上或减去一个时间段
- K3CLOUD数据权限授权
- Vagrant 构建 Linux 开发环境
- upc 9519 New Game
- 万年历升级版 Calendar
- 使用scikit中的聚类
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第26篇]描述NAF标量乘法算法
- mysql 8.0.12解压版安装教程_mysql 8.0.12 解压版安装教程