一. 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简化异步编程模式的几种写法相关推荐

  1. 利用 async amp; await 的异步编程

    一.异步编程的简介 通过使用异步编程,你可以避免性能瓶颈并增强应用程序的总体响应能力. Visual Studio 2012 引入了一个简化的方法,异步编程,在 .NET Framework 4.5 ...

  2. 使用 Async 和 Await 的异步编程

    来自:http://msdn.microsoft.com/library/vstudio/hh191443 异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要. 对 Web 资源的访 ...

  3. async 和 await 之异步编程的学习

    async修改一个方法,表示其为异步方法.而await表示等待一个异步任务的执行.js方面,在es7中开始得以支持:而.net在c#5.0开始支持.本文章将分别简单介绍他们在js和.net中的基本用法 ...

  4. 第十节 利用Quartz实现数据库定时备份

    svbadmin学习日志 本学习日志是使用Springboot和Vue来搭建的后台管理系统: 演示地址:http://118.31.68.110:8081/index.html 账号:root 密码: ...

  5. Atitit. Async await 优缺点 异步编程的原理and实现 java c# php

    Atitit. Async await 优缺点 异步编程的原理and实现 java c# php 1. async & await的来源1 2. 异步编程history1 2.1. 线程池 2 ...

  6. 使用 Task 简化异步编程

    .Net 传统异步编程概述 .NET Framework 提供以下两种执行 I/O 绑定和计算绑定异步操作的标准模式: 异步编程模型 (APM),在该模型中异步操作由一对 Begin/End 方法(如 ...

  7. Async和Await如何简化异步编程几个实例

    引言 C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作,下面就具体看看编译器到底在背后帮我们做了哪些复杂的工作的. 同步代码存 ...

  8. 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题

    async await 解决异步问题,这两个关键字是es7提出的,所以测试,node和浏览器版本提高一些 async await 操作基于promise实现的 async await这两个关键字是一起 ...

  9. JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式!...

    此篇是 JavaScript是如何工作的第四篇,其它三篇可以看这里: JavaScript是如何工作的:引擎,运行时和调用堆栈的概述! JavaScript是如何工作的:深入V8引擎&编写优化 ...

最新文章

  1. java 引用传递_详解java的值传递、地址传递、引用传递
  2. 泰一指尚大数据应用成为第一批省级重点企业研究院
  3. .netcore2.0 发布CentOS7
  4. 无法联系上证书的吊销服务器,CA服务器搭建问题,日志分析---吊销功能无法检查证书的吊销...
  5. 如何使用Windows搜索在任何文件中搜索文本
  6. zookeeper集群部署监控与选举同步流程等工作原理
  7. HTML5 实现离线数据缓存
  8. 10.15 lzxkj
  9. WBOLT热门关键词推荐插件v1.3.0 Pro 绿色版
  10. python读取pcap获得端口_Python处理网络数据包示例(pcapy读pcap文件)
  11. 手机输入法带拼音声调_最好用的输入法,百度输入法带你体验更智能的拼音输入法...
  12. 用python在大麦网抢票攻略_大麦网抢票有什么攻略?
  13. 使用计算机粘贴板的步骤,教你查看win7电脑的剪切板使用技巧和位置查看的方法...
  14. 【C语言】字符串数组按字典升序
  15. Angular Router的组件路由介绍
  16. gif制作方法教学,教你快速上手制作gif动图
  17. 陈艾盐:《春燕》百集访谈节目第三十七集
  18. 橘子树拍击弦贝司音源 Orange Tree Samples CoreBass Cherry Slapped
  19. Java神操作之SpringBoot基础上添加Kotlin混合开发
  20. android sqlite 存储对象,SQLite存储对象

热门文章

  1. android adb shell常用命令(四)
  2. 面向对象:包装类、对象处理、类成员
  3. MYSQL 在当前时间加上或减去一个时间段
  4. K3CLOUD数据权限授权
  5. Vagrant 构建 Linux 开发环境
  6. upc 9519 New Game
  7. 万年历升级版 Calendar
  8. 使用scikit中的聚类
  9. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第26篇]描述NAF标量乘法算法
  10. mysql 8.0.12解压版安装教程_mysql 8.0.12 解压版安装教程