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辅助方法将会汇总一系列的任务对象,一旦其中某个出错,则 ...
随机推荐
- HDU 6667 Roundgod and Milk Tea (思维)
2019 杭电多校 8 1011 题目链接:HDU 6667 比赛链接:2019 Multi-University Training Contest 8 Problem Description Rou ...
- TIKA环境配置
本章将指导完成设置Apache Tika在Windows和Linux的配置过程.用户管理是必要的,同时安装了Apache Tika. 系统要求 JDK Java SE 2 JDK 1.6 或以上 内存 ...
- Gradle安装配置(Windows)
在本教程中,我们将学习 Gradle 的安装,对于一个初学者,有时安装开发环境也是一个比较麻烦的问题.如果按照 Gradle 官方网站的说明安装,则可能会遇到一些麻烦,有时还要在互联网上做一些搜索,查 ...
- C#比较时间大小(时分)
比较时间大小(时分) string st1="12:13"; string st2="14:14"; DateTime dt1=Convert ...
- MySQL 建库建表规范
1.约束 1.PrimaryKey(PK)主键 特点:唯一 + 非空,一张表中只能有一个主键约束,一般是一个数字列,最好是无意义的. 2.NOT NULL 非空 特点:不能为空,建议在MySQL中,业 ...
- C#WinForm 窗体回车替换Tab
/// <summary> /// 回车切换控件 /// </summary> /// <param name="sender"></pa ...
- pytest-文件名类名方法名执行部分用例
pytest test_class_01.py 执行文件名 pytest -v -s test_class_01.py 执行文件名 pytest -v test_class_01.py::TestCl ...
- Kotlin -help
{ kotlin: run Kotlin programs, scripts or REPL. Usage: kotlin <options> <command> <ar ...
- 线性筛积性函数+反演T套路——bzoj4407
#include<bits/stdc++.h> using namespace std; #define ll long long #define mod 1000000007 #defi ...
- Cstring转char、string、int等数据类型的方法(转载)
Cstring转char.string.int等数据类型的方法 (-- ::) 转载 标签: 杂谈 分类: VC CString 转char * CString cstr; char *p = (LP ...