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辅助方法将会汇总一系列的任务对象,一旦其中某个出错,则 ...
随机推荐
- Centos 能ping通域名和公网ip但是网站不能够打开,服务器拒绝了请求。打开80端口解决。
博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/10/29/centos-%E8%83%BDping%E9%80%9A%E5%9F%9F%E ...
- 如果通过cookies和localStorage取值?
1. getCook : 设定setCookie值 let setCookie = setCookie('wan',data,7); function setCookie(c_name,value,e ...
- JS获取CkEditor在线编辑的内容
参考博文:[实践]获取CKEditor的html文本.纯文本.被选中的内容及赋值 1.获取CKEditor被选中的内容 var mySelection = CKEDITOR.instances.WOR ...
- 解决mac下,javac命令出现的乱码问题
今天突然检查我的jdk安装,发现出现了乱码 一,出现乱码
- linux fcntl 对文件描述符控制
linux fcntl 对文件描述符控制 linux fcntl 对文件描述符控制 linux fcntl 对文件描述符控制
- shell实现批量创建交叉编译工具软链接
在学习嵌入式过程中,常常用到交叉编译工具,而原本的交叉工具链比较长,不利于记忆以及使用, 解压后的交叉编译工具链如下图所示 为了更好的使用交叉编译工具与其他开发者保持一致,经常需要用到软链接. NAM ...
- FTT & NTT & 分治FFT
FFT study from: http://www.orchidany.cf/2019/02/19/FFT1/ https://www.cnblogs.com/zwfymqz/p/8244902.h ...
- 每天进步一点点-Tesseract 文字识别
Tesseract 文字识别 是github上的开源文字识别软件 下载与安装 https://github.com/tesseract-ocr/tesseract/wiki 下载 https://gi ...
- 回滚树形dp(按dfs序dp)——hdu6035
本题前面的操作别的博客里都有.难点在于颜色ci的贡献,如何一次dfs求出答案 先来考虑如何在一次dfs中单独对颜色i进行计算 用遍历dfs序的方式,在深搜过程中,碰到带有颜色 i 的点 u,u每个颜色 ...
- GDI+在Delphi程序的应用 Photoshop色相饱和度明度功能
本文用GDI+实现Photoshop色相/饱和度/明度功能,参照我的其它有关GDI+在 Delphi程序的应用的文章,代码也可供TBitmap使用. 有些人不喜欢,或者不太懂Delphi的BASM代码 ...