c#中Task.Yield的用途深入讲解

  

  

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

  

  

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

c#中Task.Yield的用途深入讲解