C# async await 举个栗子
首先,async 和 await 代表异步执行和等待。
async是一个标记,告诉编译器,我可能是一个异步方法。
await 代表等待,告诉编译器,这里等我返回结果。
下面,我们简单说一下。
一 , 首先我们看一下普通程序
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start(); MyTest();
Thread.Sleep();
Console.WriteLine("Completed"); sw.Stop();
Console.WriteLine(sw.Elapsed.Seconds);
Console.ReadKey();
} public static void MyTest()
{
Test1();
} public static void Test1()
{
Thread.Sleep();
Console.WriteLine("Test1");
}
查看结果:

结论:
由于Main()和MyTest()都存在 Thread.Sleep(5000),所以总共耗时10秒。
二 ,下面使用await / async
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start(); MyTest();
Thread.Sleep();
Console.WriteLine("Completed"); sw.Stop();
Console.WriteLine("耗时:"+sw.Elapsed.Seconds);
Console.ReadKey();
} public static async void MyTest()
{
await Test1();
} public async static Task Test1()
{
await Task.Delay();
Console.WriteLine("Test1");
}
查看结果:


结论:
运气不错,运行了2次。
因为Task异步处理,所以出现了不太一样的结果。
通过我们这个看出来主线程在5秒就结束了,而线程也在5秒左右结束了。
三 , 最后来个彩蛋,疏导和理解一下运行
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start(); MyTest();
Thread.Sleep();
Console.WriteLine("Completed"); sw.Stop();
Console.WriteLine("耗时:"+sw.Elapsed.Seconds);
Console.ReadKey();
} public static async void MyTest()
{
var q = Test1();
Console.WriteLine("==============");
var q1 = Test2();
Console.WriteLine(await q);
Console.WriteLine(await q1);
} public static async Task<string> Test1()
{
await Task.Delay();
return "";
} public static async Task<string> Test2()
{
await Task.Delay();
return "hello";
}
查看结果:

结论:
主程序运行
1 找到MyTest的"==========",输出了,
2 这个时候由于MyTest中q和q1在等待返回,
主程序继续执行下去,输出了"Completed"
3 这里很好理解,输出"耗时:3"
4 为什么把他们都设置为步骤4???因为await阻塞了主程序,在等待返回。
可是!虽然Test1耗时5秒,而Test2耗时3秒。但Test2还是要等待Test1完成才能输出,因为主程序因为await阻塞了
(如果你把Test1改成1秒,效果就明显了。)
C# async await 举个栗子的更多相关文章
- 浅谈C#中的 async await 以及对线程相关知识的复习
C#5.0以后新增了一个语法糖,那就是异步方法async await,之前对线程,进程方面的知识有过较为深入的学习,大概知道这个概念,我的项目中实际用到C#异步编程的场景比较少,就算要用到一般也感觉T ...
- C#中async/await中的异常处理
在同步编程中,一旦出现错误就会抛出异常,我们可以使用try-catch来捕捉异常,而未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.不过对于异步编程来说,异常处理一直是件麻烦的事情, ...
- .NET异步操作学习之一:Async/Await中异常的处理
以前的异常处理,习惯了过程式的把出现的异常全部捕捉一遍,然后再进行处理.Async/Await关键字出来之后的确简化了异步编程,但也带来了一些问题.接下来自己将对这对关键字进行学习.然后把研究结果放在 ...
- Javascript中的async await
async / await是Javascript是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案.目前,async / await这个特性已经是stage 3的建议,可以看看TC39的进度 ...
- 从async await 报错Unexpected identifier 谈谈对上下文的理解
原文首发地址: 先简单介绍下async await: async/await是ES6推出的异步处理方案,目的也很明确:更好的实现异步编程. 详细见阮大神 ES6入门 现在说说实践中遇到的问题:使用 ...
- 传统asp.net小心 async/await坑
最近在改老项目时,干了一件自以为很有成就感的事,心想 “项目都是同步方法,为啥不用异步方法呢?”,于是有了异步方法,类型下面的代码(当然是举例子说明啊) //更新某人名下公司名称 public Tas ...
- C#多线程和异步(二)——Task和async/await详解
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- Promise及Async/Await
一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪 ...
- 关于C#中async/await中的异常处理(下)-(转载)
上一篇文章里我们讨论了某些async/await的用法中出现遗漏异常的情况,并且谈到该如何使用WhenAll辅助方法来避免这种情况.WhenAll辅助方法将会汇总一系列的任务对象,一旦其中某个出错,则 ...
随机推荐
- Java 并发理论简述
一:为什么需要多线程? 线程是Java语言中不可或缺的重要部分,它们能使复杂的异步代码变得简单,简化复杂系统的开发:能充分发挥多处理器系统的强大计算能力.多线程和多进程的区别与选择可以参考我的另一篇博 ...
- <思维导图>思维导图
- Markdown测试2
四级标题 内容测试 内容测试 内容测试 为知笔记发布博客时会添加一些HTML或CSS的标记,会影响文章的摘要显示. A B 一 二 α" role="presentation&q ...
- 提供免费可商用的优秀背景视频素材——COVERR
现在经常看到很多网站都是贴近更现代化的设计,首页都会放置跟网站内容相关的视频短片作为背景,不用按下播放按钮,就有动态显示效果,跟以往静态图片相较下更动态.更有活力,对网站的视觉体验有一定的提升作用.但 ...
- Mac版本的 Axure rp8 不显示菜单栏
我之前也是一直在找这个问题,可能mac用的不熟练吧,其实他的菜单栏就近在眼前 你看不见只是因为你的关注点在axure上 往大了看,他的菜单栏显示在你的电脑的菜单栏上,mac的菜单栏基本都是这么显示的, ...
- mac 如何卸载node和npm采坑之旅
因为本地npm一直报错,所以决定直接卸载node和npm,重新装.第一次卸载,具体咱也不会呀!能咋整呢,百度呗 茫茫百度中各种找呀,找到一个转载最多的方法 sudo npm uninstall npm ...
- angularJs input框绑定ng-model后js获取不到问题
搬运自:https://blog.csdn.net/fenglongmiao/article/details/81545993 与其他指令一样,ng-controller指令也会创建一个子级作用域,因 ...
- UNLISTEN - 停止监听通知信息
SYNOPSIS UNLISTEN { name | * } DESCRIPTION 描述 UNLISTEN 用于删除一个现有的已注册的 NOTIFY 事件. UNLISTEN 取消当前 Postgr ...
- struts2注解方式的验证
struts2的验证分为分编程式验证.声明式验证.注解式验证.因现在的人越来越懒,都追求零配置,所以本文介绍下注解式验证. 一.hello world 参考javaeye的这篇文章,按着做一次,起码有 ...
- jdk源码阅读-ConcurrentLinkedQueue(一)
说明 concurrentLinkedQueue为无界非阻塞队列,是线程安全的 内部结构为链表的形式, 内部使用cas保存线程安全.采用cas保证原子性 什么是CAS CAS 操作包含三个操作数 —— ...