最近在阅读 .NET Threadpool starvation, and how queuing makes it worse 这篇博文时发现文中代码中的一种 Task 用法之前从未见过,在网上看了一些资料后也是云里雾里不知其解,很是困扰。今天在程序员节的大好日子里终于想通了,于是写下这篇随笔分享给大家,也过过专心写博客的瘾。

这种从未见过的用法就是下面代码中的 await Task.Yield()

static async Task Process()
{
await Task.Yield(); var tcs = new TaskCompletionSource<bool>(); Task.Run(() =>
{
Thread.Sleep(1000);
tcs.SetResult(true);
}); tcs.Task.Wait();
}

(注:上面的代码不是示例,只是因为这段代码而初遇 await Task.Yield)

Task.Yield 简单来说就是创建时就已经完成的 Task ,或者说执行时间为0的 Task ,或者说是空任务,也就是在创建时就将 Task 的 IsCompeted 值设置为0。

那 await 一个空任务会怎样?我们知道在 await 时会释放当前线程,等所 await 的 Task 完成时会从线程池中申请新的线程继续执行 await 之后的代码,这本来是为了解决异步操作(比如IO操作)霸占线程实际却用不到线程的问题,而 Task.Yield 却产生了一个不仅没有异步操作而且什么也不干的 Task ,不是吃饱了撑着吗?

今天吃晚饭的时候终于想明白了——吃饱了没有撑。Task.Yield 产生的空任务仅仅是为 await 做嫁衣,而真正的图谋是借助 await 实现线程的切换,让 await 之后的操作重新排队从线程池中申请线程继续执行。这样做有什么好处呢?线程是非常非常宝贵的资源,千金难买一线程,而且有优先级,提高线程利用率的重要手段之一就是及时将线程分配给最需要的地方,而最奢侈的之一是让一个优先级低执行时间长的操作一直占用着一个线程,await Task.Yield 可以让你巧妙地借助 await 的线程切换能力,将不太重要的比较耗时的操作放在新的线程(重新排队从线程池中申请到的线程)中执行。打个比方,很多人排队在外婆家就餐,你来的时候比较巧,正好有位置,但你本来就不着急肚子也不太饿准备慢慢吃慢慢聊,而排队的人当中有些人很饿很着急吃完还有事,这时你如果先点几个招牌菜解解馋,然后将座位让出来,重新排队,并且排队的人当中像你这样的都这么做,那些排队中心急如焚的人真是是幸福感爆棚,外婆家的老板也笑弯了腰。你让出座位重新排队的爱心行为就是 await Task.Yield()

祝大家程序员节快乐!

补充 - 后来发现的相关链接:

最新文章

  1. python raise a string exception is deprecated
  2. 如何消除移动端a标签点击时的蓝色底色以及a标签link、visited、hover、active的顺序
  3. [Error] Error parsing XML: unbound prefix
  4. IRelationalOperator空间关系接口简介
  5. linux的chmod与chown命令详解
  6. Unity3D之Mecanim动画系统学习笔记(十):Mecanim动画的资源加载相关
  7. ubuntu on win VS ubuntu(virtual box)VS Cygwin
  8. poj 1284 Primitive Roots
  9. 关于type check的定义
  10. postgresql文档生成注意事项
  11. 注解【介绍、基本Annotation、元Anntation、自定义注解、注入基本信息、对象】
  12. Mysql中concat()、concat_ws()和 group_concat()的用法
  13. Ubuntu下pdf和图片互转
  14. 小trick总结
  15. linux suse 同步时间
  16. jdbc练习demo
  17. hadoop hdfs设置quota
  18. MVC流程
  19. mybatis mapper调用mysql存储过程
  20. python 对列表去重,并保持列表原来顺序

热门文章

  1. Vue技术内幕 出去看看吧
  2. C# - 操作符
  3. 11.2.0.4 aix下运行第二个节点root.sh报错处理
  4. Spring MVC详解
  5. Visual Studio 2015中 没有“安装和部署”的解决方法
  6. Kafka简单使用
  7. JAVA 实现 简单的 HTTP服务器
  8. win7下安装linux(centos6.5)双系统详细小白教程
  9. HTML常用基础标签
  10. Mac App开发