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辅助方法将会汇总一系列的任务对象,一旦其中某个出错,则 ...
随机推荐
- 剑指offer第二版面试题10:斐波那契数列(JAVA版)
题目:写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列的定义如下: 1.效率很低效的解法,挑剔的面试官不会喜欢 使用递归实现: public class Fibonacci { public ...
- 剑指offer第二版面试题4:替换空格(JAVA版)
题目:请实现一个函数,把字符串中的每个空格替换成“%20”.例如输入“We are happy”,则输出”We%20are%20happy”. 原因:在网络编程中,如果URL参数中含有特殊字符,如:空 ...
- ssh 登陆免 known_hosts 提示
修改配置文件 “~/.ssh/config”,加上这两行,重启服务器: StrictHostKeyChecking no UserKnownHostsFile /dev/null
- 剑指offer——55两个链表的第一个公共节点
题目描述 输入两个链表,找出它们的第一个公共结点. 题解: 分别遍历两个链表到链尾,并计算其长度,若最后一个节点相同,则存在公共节点 然后让长链表指针从头先移动长度差个节点,然后两个链表指针一起移动, ...
- 7-vim-移动命令-02-行数跳转和上下翻页
1.行数跳转 命令 英文 功能 gg go 文件顶部 G GO 文件尾部 数字gg 移动到数字对应行数 数字G 移动到数字对应行数 :数字 移动到数字对应行数 2.屏幕移动 命令 英文 功 ...
- Unity中实现网格轮廓效果,选中边框效果
问题背景: 最近要实现选中实体的高亮效果,要那种类似于unity中Outline的效果,网格轮廓高亮效果. 效果图: 具体代码: OutlineEffect.cs 实体高亮效果类: 轮廓边总控制类,该 ...
- C语言static和局部变量
#include <stdio.h> void test(); int main() { /************************************************ ...
- 关于apache 重定向设定
本人在研究关于apache重定向的资料,在网上找了很多,但是就本人来说,方便理解的,找到了这么一个,记录了下来,原帖地址:http://www.exehack.net/8.html 关于apache配 ...
- [HDU3333]Turing Tree
莫队模板题... 不过树状数组也可以做...跟HH的项链几乎一模一样,离线询问,然后记录前缀,更新的时候把前缀删掉就好了,然而这题开long long,卡空间 //hgs AK IOI,IMO,ICH ...
- springboot java.util.NoSuchElementException: No value present 异常处理
使用jpa查询的时候,如果查询不到数据,就会返回这个错误,下面是处理方法. @Override public User findByEmail(String email) { User user = ...