最近在阅读。net Threadpool饥饿,以及如何排队让情况变得更糟这篇博文时发现文中代码中的一种任务用法之前从未见过,在网上看了一些资料后也是云里雾里不知其解,很是困扰。今天在程序员节的大好日子里终于想通了,于是写下这篇随笔分享给大家,也过过专心写博客的瘾。
这种从未见过的用法就是下面代码中的<代码>等待Task.Yield() 代码>:
静态的异步任务过程() { 等待Task.Yield (); tcs var=new TaskCompletionSource(); Task.Run(()=比; { thread . sleep (1000); tcs.SetResult(真正的); }); tcs.Task.Wait (); }
(上面的代码不是示例,只是因为这段代码而初遇<代码>等待Task.Yield> 代码)
任务。收益率简单来说就是创建时就已经完成的任务,或者说执行时间为0的任务,或者说是空任务,也就是在创建时就将任务的IsCompeted值设置为0。
那等待一个空任务会怎样?我们知道在等待时会释放当前线程,等所等待的任务完成时会从线程池中申请新的线程继续执行等待之后的代码,这本来是为了解决异步操作(比如IO操作)霸占线程实际却用不到线程的问题,而任务。收益率却产生了一个不仅没有异步操作而且什么也不干的任务,不是吃饱了撑着吗?
今天吃晚饭的时候终于想明白了——吃饱了没有撑.Task。产量产生的空任务仅仅是为等待做嫁衣,而真正的图谋是借助等待实现线程的切换,让等待之后的操作重新排队从线程池中申请线程继续执行。
<强>这样做有什么好处呢? 强>
线程是非常非常宝贵的资源,千金难买一线程,而且有优先级,提高线程利用率的重要手段之一就是及时将线程分配给最需要的地方,而最奢侈的之一是让一个优先级低执行时间长的操作一直占用着一个线程,<代码>等待任务。收益率> 代码可以让你巧妙地借助等待的线程切换能力,将不太重要的比较耗时的操作放在新的线程(重新排队从线程池中申请到的线程)中执行。打个比方,很多人排队在外婆家就餐,你来的时候比较巧,正好有位置,但你本来就不着急肚子也不太饿准备慢慢吃慢慢聊,而排队的人当中有些人很饿很着急吃完还有事,这时你如果先点几个招牌菜解解馋,然后将座位让出来,重新排队,并且排队的人当中像你这样的都这么做,那些排队中心急如焚的人真是是幸福感爆棚,外婆家的老板也笑弯了腰。你让出座位重新排队的爱心行为就是<代码>等待Task.Yield() 代码>。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。