深圳外贸建设网站用dw设计一个简单网页
web/
2025/9/26 21:39:10/
文章来源:
深圳外贸建设网站,用dw设计一个简单网页,网站推广软文公司,瑞安网站建设最近在阅读 .NET Threadpool starvation, and how queuing makes it worse 这篇博文时发现文中代码中的一种 Task 用法之前从未见过#xff0c;在网上看了一些资料后也是云里雾里不知其解#xff0c;很是困扰。今天在程序员节的大好日子里终于想通了#xff0c;于是写下这篇… 最近在阅读 .NET Threadpool starvation, and how queuing makes it worse 这篇博文时发现文中代码中的一种 Task 用法之前从未见过在网上看了一些资料后也是云里雾里不知其解很是困扰。今天在程序员节的大好日子里终于想通了于是写下这篇随笔分享给大家也过过专心写博客的瘾。这种从未见过的用法就是下面代码中的 await Task.Yield() static async Task Process(){ await Task.Yield(); var tcs new TaskCompletionSourcebool();Task.Run(() {Thread.Sleep(1000);tcs.SetResult(true);});tcs.Task.Wait();
}注上面的代码不是示例只是因为这段代码而初遇 await Task.YieldTask.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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81378.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!