终于明白了 C# 中 Task.Yield 的用途

最近在阅读 .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()

祝大家程序员节快乐!

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

  • 出让执行权:Task.Yield, Dispatcher.Yield: https://walterlv.com/post/yield-in-task-dispatcher.html 

原文地址: https://www.cnblogs.com/dudu/p/task-yield.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Wannafly挑战赛23F-计数【原根,矩阵树定理,拉格朗日插值】

正题 题目链接:https://ac.nowcoder.com/acm/contest/161/F 题目大意 给出nnn个点的一张图&#xff0c;求它的所有生成树中权值和为kkk的倍数的个数。输出答案对ppp取模 1≤n,k≤100,1≤m≤104,p∈[2,109]∩Pri1\leq n,k\leq 100,1\leq m\leq 10^4,p\in[2,10^9]\cap Pri1≤n,…

【数论】Crash的数字表格 / JZPTAB(P1829)

正题 P1829 题目大意 给出n,m&#xff0c;求∑i1n∑j1mlcm(i,j)\sum_{i1}^n\sum_{j1}^mlcm(i,j)i1∑n​j1∑m​lcm(i,j) 解题思路 ∑i1n∑j1mlcm(i,j)\sum_{i1}^n\sum_{j1}^mlcm(i,j)i1∑n​j1∑m​lcm(i,j) ∑d1nd∑i1n/d∑j1m/di∗j[gcd(i,j)1]\sum_{d1}^nd\sum_{i1}^{n/d}…

2018-2019 ACM-ICPC, Asia Seoul Regional Contest——A - Circuits

A - Circuits 不难发现x坐标根本没用&#xff0c;只需要存储y坐标。 题目所求的两条直线y1ay_1ay1​a&#xff0c;y2b(a<b)y_2b\ (a<b)y2​b (a<b) 我们枚举y2by_2by2​b这条线&#xff0c;这条线一定可以是矩形的边界&#xff0c;于是我们扫描矩形边界差分计算当前…

aspnet core 2.1中使用jwt从原理到精通一

原理jwt对所有语言都是通用的&#xff0c;只要知道秘钥&#xff0c;另一一种语言有可以对jwt的有效性进行判断;jwt的组成&#xff1b;Header部分Base64转化.Payload部分Base64转化.使用HS256方式根据秘钥对前面两部分进行加密后再Base64转化&#xff0c;其中使用的hs256加密是h…

2020牛客国庆集训派对day3 Points

Points 题目描述 Jack and Rose are playing games after working out so many difficult problems. They together drew a “Haizi” tree to show their collaboration. “Haizi” tree is the same as the tree defined in graph theory. Now Jack would like to count t…

CF1137F-Matches Are Not a Child‘s Play【LCT】

正题 题目链接:https://www.luogu.com.cn/problem/CF1137F 题目大意 给出nnn个点的一棵树&#xff0c;第iii个点权值为iii。 一棵树的删除序列定义为每次删除编号最小的叶子并将其加入序列末尾。 要求支持 修改一个点的权值为一个比目前所有权值都要大的一个值询问一个点在…

【数论】数表(P3312)

正题 P3312 题目大意 给出n,m,a&#xff0c;求∑i1n∑j1mσ(gcd(i,j))[σ(gcd(i,j))≤a]\sum_{i1}^n\sum_{j1}^m\sigma(gcd(i,j))[\sigma(gcd(i,j))\leq a]i1∑n​j1∑m​σ(gcd(i,j))[σ(gcd(i,j))≤a] 解题思路 先不考虑a的条件限制 ∑i1n∑j1mσ(gcd(i,j))\sum_{i1}^n\su…

codeforces1452 E. Two Editorials

E. Two Editorials 官方题解 首先将每个参赛者按照区间中点排序&#xff0c;那么前一段参赛者听第一个人&#xff0c;而后一段听第二个人的。 预处理数组su[j]表示j→mj\to mj→m这些参赛者能被“覆盖”最多“贡献” 只需要枚举第一个人演讲的区间&#xff0c;再考虑前多少参赛…

.NET Core微服务之路:利用DotNetty实现一个简单的通信过程

上一篇我们已经全面的介绍过《基于gRPC服务发现与服务治理的方案》&#xff0c;我们先复习一下RPC的调用过程&#xff08;笔者会在这一节的几篇文章中反复的强调这个过程调用方案&#xff09;&#xff0c;看下图根据上面图&#xff0c;服务化原理可以分为3步&#xff1a;服务端…

codeforces1451 C. String Equality

真的弱&#xff0c;这题都想蹦了。 这场md&#xff0c;b题看错题调了1小时才发现&#xff0c;c题上来也看错。。最后懒得写了睡觉~ C. String Equality 神的讲解 注意到连续k个相同字符才能使用操作二&#xff0c;不过我们可以交换&#xff0c;由此不难知道是否能够交换之和出…

YbtOJ#732-斐波那契【特征方程,LCT】

正题 题目链接:http://www.ybtoj.com.cn/contest/125/problem/2 题目大意 给出nnn个点的一棵树&#xff0c;以111为根&#xff0c;每个点有点权aia_iai​。要求支持mmm次操作 修改一个修改一个节点的父节点修改一条路径的权值为www给出uuu询问Fbi(au)Fbi(a_u)Fbi(au​)给出u…

2020牛客国庆集训派对day3 Leftbest

Leftbest 链接&#xff1a;https://ac.nowcoder.com/acm/contest/7830/A 来源&#xff1a;牛客网 题目描述 Jack is worried about being single for his whole life, so he begins to use a famous dating app. In this app, the user is shown single men/women’s photos …

【笛卡尔树】【树状数组】Beautiful Pair(P4755)

正题 P4755 题目大意 给你n个数&#xff0c;问你有多少对二元组 (i,j)(i,j)(i,j) 满足 i≤ji\leq ji≤j 且 aiaj≤maxiijaia_i\times a_j\leq max_{ii}^ja_iai​aj​≤maxiij​ai​ 解题思路 考虑对原数组构建笛卡尔树&#xff0c;树中左右子树之间的二元组所取得的max就是当…

[译]ASP.NET Core中使用MediatR实现命令和中介者模式

在本文中&#xff0c;我将解释命令模式&#xff0c;以及如何利用基于命令模式的第三方库来实现它们&#xff0c;以及如何在ASP.NET Core中使用它来解决我们的问题并使代码简洁。因此&#xff0c;我们将通过下面的主题来进行相关的讲解。什么是命令模式?命令模式的简单实例以及…

【贪心】数据备份(P6320)

正题 P6320 题目大意 有n个点&#xff0c;相邻的点不能同时选&#xff0c;问你选k个的最小代价 解题思路 考虑贪心取每个点&#xff0c;取了一个点后设置一个撤回点&#xff0c;就是把该点的选择取反&#xff0c;同时选择左右&#xff0c;这样直接用堆维护即可 code #inclu…

codeforces1451 D. Circle Game

D. Circle Game 看到博弈题&#xff0c;直接打表不过并不能发现什么规律gg 后手每次按照先手对称进行移动&#xff0c;如果先手向右则向上&#xff0c;先手向上则向右&#xff0c;然后考虑最后一步即可。 对称技巧&#xff01;&#xff01;&#xff01; #define IO ios::syn…

2020-10-03

Flowers 题目描述 Recently Jack becomes much more romantic. He would like to prepare several bunches of flowers. Each bunch of flowers must have exactly M flowers. As Jack does not want to be boring, he hopes that flowers in the same bunch are all differ…

P4770-[NOI2018]你的名字【SAM,线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/P4770 题目大意 给出一个长度为nnn的字符串SSS。qqq次询问给出一个串TTT和一个区间[L,R][L,R][L,R]&#xff0c;求TTT有多少个本质不同的子串不是SL∼RS_{L\sim R}SL∼R​的子串。 1≤n≤5105,1≤Q≤105,∑∣T∣≤1061\leq n…

.NET in Browser - Blazor

什么是BlazorBlazor 是一个实验性的. NET web 框架, 使用 C# 和 HTML 在任何浏览器中不需要插件即可运行 WebAssembly 程序集。什么是WebAssemblyWebAssembly是一种新的适合于编译到Web的&#xff0c;可移植的&#xff0c;大小和加载时间高效的格式&#xff0c;是一种新的字节码…

【数论】【杜教筛】选数(P3172)

正题 P3172 题目大意 在 [L,R] 选n个数&#xff0c;问gcdk的方案数 解题思路 因为gcdk&#xff0c;那么所选的数都是k的倍数&#xff0c;那么可以让L,R整除k&#xff0c;那么有 ∑a1LR∑a2LR...∑anLR[gcd(a1,a2...an)1]\sum_{a_1L}^R\sum_{a_2L}^R...\sum_{a_nL}^R[gcd(a_1…