HTML5技术

C#与C++的发展历程第三 - C#5.0异步编程巅峰 - hystar(9)

字号+ 作者:H5之家 来源:博客园 2016-01-15 10:03 我要评论( )

await 不会开启新的线程,当前线程会一直往下走直到遇到真正的Async方法(比如说HttpClient.GetStringAsync),这个方法的内部会用Task.Run或者Task.Factory.StartNew 去开启线程。也就是如果方法不是.NET为我们提

await 不会开启新的线程,当前线程会一直往下走直到遇到真正的Async方法(比如说HttpClient.GetStringAsync),这个方法的内部会用Task.Run或者Task.Factory.StartNew 去开启线程。也就是如果方法不是.NET为我们提供的Async方法,我们需要自己创建Task,才会真正的去创建线程。

这个这个观点应该是正确的,可后来看了很多代码后感觉还不完全是这样,毕竟一个被调用的async方法就会产生一个新的Task,而这个新的Task可能去“开启一个新线程”。改造下上面的代码测试这个问题:

public class Service {     private readonly Repository _repository;     public Service(Repository repository)     {         _repository = repository;     }     public async Task<string> GetUserName(int id)     {         Console.WriteLine(Thread.CurrentThread.ManagedThreadId);         var name = await _repository.GetById(id);         Console.WriteLine(Thread.CurrentThread.ManagedThreadId);         return name;     } } public class Repository {     private DbContext _dbContext;     private DbSet<User> _set;     public Repository()     {         _dbContext = new DbContext("");         _set = _dbContext.Set<User>();     }     public async Task<string> GetById(int id)     {                 //IO...         var user = await _set.FindAsync(id);         return user.UserName;     } }

在控制台应用中执行这段代码会发现输出的两个线程Id是不相同的。

提示:控制台引用程序没有SynchronizationContext,在不恢复SynchronizationContext的情况下能更好的看出线程的变化。

到底情况是怎样的呢,这里试着分析下我的想法:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 2年前端学习历程,与找不到工作的悲愤与吐槽!(100%真实经历,看博主怎么一步步走向失业) - 蒋启钲

    2年前端学习历程,与找不到工作的悲愤与吐槽!(100%真实经历,看博

    2017-03-29 11:00

  • 开源第三方登录组件OAuthLogin2.0 支持QQ,阿里巴巴,淘宝,京东,蘑菇街,有赞等平台 - 大壮他哥

    开源第三方登录组件OAuthLogin2.0 支持QQ,阿里巴巴,淘宝,京东,蘑菇街

    2017-01-20 15:00

  • 从零到百亿互联网金融架构发展史 - 纯洁的微笑

    从零到百亿互联网金融架构发展史 - 纯洁的微笑

    2017-01-14 13:00

  • 记一次企业级爬虫系统升级改造(四):爬取微信公众号文章(通过搜狗与新榜等第三方平台) - 彩色铅笔

    记一次企业级爬虫系统升级改造(四):爬取微信公众号文章(通过搜狗

    2017-01-12 10:01

网友点评
M