aync await 进一步探索
aync await 进一步探索
首先来个例子
class Program
{
static int index = 1;
static void Log(string str)
{
Console.WriteLine((index++) + ". " + str + ". ThreadId:" + Thread.CurrentThread.ManagedThreadId);
}
static void Main(string[] args)
{
//解决.net core控制台输出中文乱码的代码
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
//async 不能用于Main方法,所以在这里单独使用一个方法来调用,各位可以试试,编译不过,但VS就是不会告诉你错误在哪里
ExcuteAsync();
Console.ReadLine();
}
static async void ExcuteAsync() {
Log("异步方法调用前");
var ret = AsyncMethod();
Log("异步方法调用后");
Log(await ret);
Log("异步方法使用await后");
}
static async Task<string> AsyncMethod() {
Log("异步方法开始");
var task = Task.Run<string>(() =>
{
Log("异步方法内部开始");
Thread.Sleep(3000);
Log("异步方法内部结束");
return "来自异步方法内部的结果";
});
Log("异步方法结束");
var ret = await task;
Log("异步方法await结束");
return ret;
}
}
控制台输出结果
1. 异步方法调用前. ThreadId:1
2. 异步方法开始. ThreadId:1
3. 异步方法结束. ThreadId:1
4. 异步方法内部开始. ThreadId:3
5. 异步方法调用后. ThreadId:1
6. 异步方法内部结束. ThreadId:3
7. 异步方法await结束. ThreadId:3
8. 来自异步方法内部的结果. ThreadId:3
9. 异步方法使用await后. ThreadId:3
分析
为了描述更方便,为每条输出都添加了序号。 为了更清晰的知道每一步的执行顺序以及所在的线程,均添加了ThreadId
- 第1条输出,主线程,没有什么特别的。
- 第2条输出,主线程,说明:调用异步方法本身并不会另起一个线程,如果这里面没有await的话,调用这个方法和调用普通方法没有任何区别。
- 第3条输出,主线程,说明:执行异步方法后主线程并没有被挂起,而是直接继续往下走。
- 第4条输出,线程3(代表子线程,不一定每次都是3),代码显示的要起用一个新线程,没有什么特别的。
- 第5条输出,主线程,和第3条一样,主线程继续往下走,只是代码在不同的方法里而已。
- 第6条输出,线程3,内部执行结束,没什么特别。
- 第7条输出,线程3,说明:这里有一个不同的地方,使用了await,可见,这里是子线程的延续
- 第8-9条输出,线程3,和第7条一样,延续了子线程。
变种
我们把ExcuteAsync方法里的await ret,改成ret.Result看看效果
1. 异步方法调用前. ThreadId:1
2. 异步方法开始. ThreadId:1
3. 异步方法结束. ThreadId:1
4. 异步方法内部开始. ThreadId:3
5. 异步方法调用后. ThreadId:1
6. 异步方法内部结束. ThreadId:3
7. 异步方法await结束. ThreadId:3
8. 来自异步方法内部的结果. ThreadId:1
9. 异步方法使用await后. ThreadId:1
第8-9条输出线程变了,可见是主线程被挂起了,等待子线程结束后继续往下执行。那么如果在AsyncMethod里也使用Result,效果又是什么样的?
我们把AsyncMethod方法里的await task改成task.Result,看输出结果
1. 异步方法调用前. ThreadId:1
2. 异步方法开始. ThreadId:1
3. 异步方法结束. ThreadId:1
4. 异步方法内部开始. ThreadId:3
5. 异步方法内部结束. ThreadId:3
6. 异步方法await结束. ThreadId:1
7. 异步方法调用后. ThreadId:1
8. 来自异步方法内部的结果. ThreadId:1
9. 异步方法使用await后. ThreadId:1
现在只有Task内部的输出是在子线程了。可见,使用Result的话会失去异步的效果,换句话说,使用Result就不再是异步调用了。
附:文笔不好,只能用习惯的代码来描述,希望能给读者带来帮助。
aync await 进一步探索的更多相关文章
- Celery:进一步探索
一.创建Celery专用模块 对于大型项目,一般需要创建一个专用模块,便于管理. 1.1 模块结构 proj/__init__.py /celery.py /tasks.py proj/celery. ...
- 进一步探索:Windows Azure 网站中解锁的配置选项
编辑人员注释: 本文章由 Windows Azure 网站团队的项目经理 Erez Benari 撰写. 在 Windows Azure 网站 (WAWS) 中管理网站时,许多选项可使用 Azu ...
- Python标准库11 多进程探索 (multiprocessing包)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在初步了解Python多进程之后,我们可以继续探索multiprocessing包 ...
- c#之Async、Await剖析
c#之Async.Await剖析 探索c#之Async.Await剖析 2015-06-15 08:35 by 蘑菇先生, 1429 阅读, 5 评论, 收藏, 编辑 阅读目录: 基本介绍 基本原理剖 ...
- [转] Async/Await替代Promise的6个理由
Node.js 7.6已经支持async/await了,如果你还没有试过,这篇博客将告诉你为什么要用它. Async/Await简介 对于从未听说过async/await的朋友,下面是简介: asyn ...
- Hadoop2源码分析-RPC探索实战
1.概述 在<Hadoop2源码分析-RPC机制初识>博客中,我们对RPC机制有了初步的认识和了解,下面我们对Hadoop V2的RPC机制做进一步探索,在研究Hadoop V2的RPC机 ...
- 每一行代码都有记录—如何用git一步步探索项目的历史
每一行代码都有一块被隐藏了的文档信息. 下面的代码片段不管是谁写的,其第4行因为某些原因要访问一个DOM结点的clientLeft属性,但却对结果不作任何处理.这十分的莫名其妙,你能告诉我他们为什么要 ...
- 企查查app 初步探索
企查查app sign算法破解初步探索 之前有说过企查查的sign的解密,但这次是企查查app的sign算法破解,目前是初步进程. 已删除!!!! 上边一些变量已经找到了,其中就有时间戳,其余两个需要 ...
- python_lesson2 多进程探索 (multiprocessing包)
进程池 进程池 (Process Pool)可以创建多个进程.这些进程就像是随时待命的士兵,准备执行任务(程序).一个进程池中可以容纳多个待命的士兵. import multiproces ...
随机推荐
- GitHub 添加 SSH keys
首先在本地创建 SSH Keys $ ssh-keygen -t rsa -C "18817801185@163.com" 后面的邮箱即为 github 注册邮箱,之后会要求确认路 ...
- webpack2.x基础属性讲解(一)
webpack作为构建工具平时作为前端作为优化.模块编程.和分片打包的重要组成部分,大家可能并不陌生,如果没有时刻的去关注文档,那么大家可能不太清楚webpack已经默默然的升级到2.x了,对比1 ...
- 用webpack搭建react开发环境
安装插件: npm install react react-dom babel-loader babel-core babel-preset-react babel-preset-es2015 配置w ...
- 老李分享:大数据框架Hadoop和Spark的异同
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...
- php Redis常用命令
redis是一个很好的缓存工具,下面我们就来介绍一下他怎么使用 启动 Redis 服务src/redis-server或者src/redis-server redis.conf src/Redis-s ...
- Fragment防止自动清理 (ViewPager滑动时,滑出屏幕后被清理)(转)
原文链接:http://www.xuebuyuan.com/2231000.html 这个问题网上搜一搜发现帖子很多,但是博主试了几种好像没有说的那么好用 一. 比如给ViewPager设置长度,以增 ...
- oralce set
1 SET TIMING ON 说明:显示SQL语句的运行时间.默认值为OFF. 在SQLPLUS中使用,时间精确到0.01秒.也就是10毫秒. 在PL/SQL DEVELOPER 中 ...
- UPS电源效果及有关名词解析
UPSuninterruptpowersystem缩写,4.工频机和高频机<工频机UPS选用工频变压器作为整流器和逆变器的部件的UPS电源:高频机是以高频开关元件代替整流器和逆变器中粗笨的工频变 ...
- EF 关联数据查询
1 直接使用表对应的实例属性值 ,如本例中的RoleUserInfo的属性UserInfo IEnumerable <RoleUserInfo > roleUserInfos= db.Ro ...
- LINQ TO XML初步了解
最近简单的学习了一下LINT TO XML,写篇博客在这,方便以后查看~~ 1.常用到的类 XmlDocument -- 文档(xml文件) XmlElement -- ...