一般来说我们写的控制台程序都只使用了一个线程,从第一条语句按顺序执行到最后一条。但在很多的情况下,这种简单的模型会在性能或用户体验上不好,这也叫同步方法。
例如:服务器要同时处理来自多个客户端程序的请求,又要等待数据库和其它设备的响应,这将严重影响性能。程序不应该将时间浪费在响应上,而要在等待的同时执行其它任务!
现在我们开始进入异步编程。**在异步程序中,代码不需要按照编写时的顺序执行。**这时我们需要用到 C# 5.0 引入的 async/await 来构建异步方法。

异步方法:在执行完成前立即返回调用方法,执行其它方法。

async/await 结构可分成三部分:
(1)调用方法:该方法调用异步方法,然后在异步方法执行其任务的时候继续执行;
(2)异步方法:该方法异步执行工作,然后立刻返回到调用方法;
(3)await 表达式:用于异步方法内部,指出需要异步执行的任务。一个异步方法可以包含多个 await 表达式(不存在 await 表达式的话 IDE 会发出警告)。

在遇到awiat关键字之前,程序是按照代码顺序自上而下以同步方式执行的。
在遇到await关键字之后,系统做了以下工作:
异步方法将被挂起
将控制权返回给调用者
使用线程池中的线程(而非额外创建新的线程)来计算await表达式的结果,所以await不会造成程序的阻塞
完成对await表达式的计算之后,若await表达式后面还有代码则由执行await表达式的线程(不是调用方所在的线程)继续执行这些代码

定义一个异步方法应满足以下几点:
使用async关键字来修饰方法
在异步方法中使用await关键字(不使用编译器会给出警告但不报错),否则异步方法会以同步方式执行
尽量不使用void作为返回类型,若希望异步方法返回void类型,请使用Task
异步方法名称以Async结尾
异步方法中不能声明使用ref或out关键字修饰的变量

使用async await

private async void button45_ClickAsync(object sender, EventArgs e){//如果使用await  那么方法要加async关键字  这里不需要返回结果把方法改为void的即可   不然报错//会先执行方法三   因为方法三使用了await(等待)   这里会等待方法三执行完后再去执行其它方法//方法一是普通异步方法但是耗时较长,在执行的过程中返回了    所以方法二会优于方法一执行await 方法三Async();方法一();方法二();} public void 方法二() {Console.WriteLine("同步方法2");}public async Task 方法三Async(){//如果使用await  那么方法要加async关键字Console.WriteLine("1111");await  Task.Run(() =>{//在这里我们使用了await   会等待task.run的内容结束后再去执行输出22222Thread.Sleep(4000);Console.WriteLine("同步方法3");});Console.WriteLine("22222");}public void 方法一() {Task.Run(() =>{Thread.Sleep(3000);Console.WriteLine("异步方法1");});}

让两个异步函数同时运行,执行完后再跑剩下的方法

我们在代码中可能会遇到异步函数执行过快但是还没有得到结果就报错了,这里我们使用whenAll可以解决

private async void button48_Click(object sender, EventArgs e){Console.WriteLine("1111");await Task.WhenAll(func1(), func2());Console.WriteLine("4444");} private static async Task func1(){ await Task.Run(() =>{Thread.Sleep(2000);Console.WriteLine("2222");}); }private static async Task func2(){ await Task.Run(() =>{Thread.Sleep(2000);Console.WriteLine("3333");});}

c# async await异步方法相关推荐

  1. @async 默认线程池_.NET Web应用中为什么要使用async/await异步编程?

    布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com 前言 1.什么是async/await? await和async是.NET Framework ...

  2. async/await 的基本实现和 .NET Core 2.1 中相关性能提升

    前言 这篇文章的开头,笔者想多说两句,不过也是为了以后再也不多嘴这样的话. 在日常工作中,笔者接触得最多的开发工作仍然是在 .NET Core 平台上,当然因为团队领导的开放性和团队风格的多样性(这和 ...

  3. Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  4. C#多线程和异步(二)——Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  5. 简单说说async/await

    小明用async/await写了几年的异步方法,但总没有完全理解里面的机制,他决定去请教邻居小花. 小花听了小明的描述后说:首先你要明白异步的根本是什么?大白话解释异步就是:拉一个人(线程)帮着做一些 ...

  6. 深入async/await知多少

    .net的async/await功能相信对很多人来说并不陌生了,有人感觉这功能很好,但也有人说这功能不好容易产生一些莫名其妙的死锁:有人说这些异步功能也有人说这是同步功能.其实在使用async/awa ...

  7. async,await执行流看不懂?看完这篇以后再也不会了

    昨天有朋友在公众号发消息说看不懂await,async执行流,其实看不懂太正常了,因为你没经过社会的毒打,没吃过牢饭就不知道自由有多重要,没生过病就不知道健康有多重要,没用过ContinueWith就 ...

  8. 在.NET中执行Async/Await的两种错误方法

    微信公众号:架构师高级俱乐部 关注可了解更多的编程,架构知识.问题或建议,请公众号留言; 如果你觉得此文对你有帮助,欢迎转发 在.NET中执行异步/等待的两种错误方法 在应用开发中,我们为了提高应用程 ...

  9. Async,Await和ConfigureAwait的关系

    在.NET Framework 4.5中,async / await关键字已添加到该版本中,简化多线程操作,以使异步编程更易于使用.为了最大化利用资源而不挂起UI,你应该尽可能地尝试使用异步编程.虽然 ...

  10. 深入理解Async/Await

    C# 5 Async/Await 语法特性,极大地简化了异步编程,但我们知道,异步编程的基本原理并没有发生根本改变.也就是说,当一些复杂的东西看起来很简单时,它通常意味着有一些有趣的事情在背后发生.在 ...

最新文章

  1. HTTP POST GET 区别详解
  2. tcp connection setup的实现
  3. ML之回归预测:利用九大类机器学习算法对无人驾驶汽车系统参数(2018年的data,18+2)进行回归预测值VS真实值
  4. 启明云端分享| ESP32-S3支持自定义离线语音,可支持 200 条本地命令语句,无需外加 DSP 芯片
  5. UVALive4256 Salesmen
  6. C语言 vprintf 函数和 printf 函数区别 - C语言零基础入门教程
  7. mysql之 slow log 慢查询日志
  8. html css表格样式模板_Excel报价单模板,完整表格设计,82套多样式选择,拿来就用...
  9. [转载]你是那个能和我同行一生的人吗?
  10. Android彩信发送
  11. 【学习生涯】预科学习笔记
  12. VBS脚本实现宽带上网加网页认证上网双验证
  13. 当别人对自己有意见时,怎么处理?
  14. 【PLC编程】西门子工艺对象 – 连续控制器CONT_C的使用
  15. Python flask入门
  16. 电脑计算机怎么没有桌面显示器,电脑显示器没有全屏显示怎么解决
  17. 波段操作实盘阶段性总结
  18. 计算机操作系统英文论文,计算机操作系统英文论文
  19. png转jpg背景颜色改变的问题
  20. 代理,正向代理和反向代理

热门文章

  1. 静默安装apk,静默卸载apk
  2. 魅蓝note2android8,魅族魅蓝Note3和魅蓝Note2哪个好
  3. java如何避免死锁_java并发编程如何预防死锁
  4. mysql5.7主从复制_MySQL 5.7.18的安装及主从复制(主从同步)
  5. springboot flink结果输入到hbase_Flink流处理
  6. linux 查看运行平台,linux查看程序运行相关命令
  7. python 和 的区别_Python中is和==的区别
  8. 数位 dp 最低位最高位之差绝对值大于2_面试必备——手撕代码(2)“买卖股票的最佳时机”...
  9. linux mysql 5.7.13 安装_Linux环境下mysql5.7.13安装教程
  10. mysql show profiles 使用分析sql 性能