C#的 Task,Thread,ThreadPool 之间有什么异同

 我来答
handangaoyang
2016-04-01 · TA获得超过2242个赞
知道大有可为答主
回答量:2633
采纳率:88%
帮助的人:928万
展开全部

你这个问题比较大。

首先说Thread、ThreadPool

  1. 前台线程:主程序必须等待线程执行完毕后才可退出程序。Thread默认为前台线程,也可以设置为后台线程

  2. 后台线程:主程序执行完毕后就退出,不管线程是否执行完毕。ThreadPool默认为后台线程

  3. 线程消耗:开启一个新线程,线程不做任何操作,都要消耗1M左右的内存

  4. ThreadPool为线程池,其目的就是为了减少开启新线程的消耗(使用线程池中的空闲线程,不必再开启新线程),以及统一管理线程(线程池中的线程执行完毕后,回归到线程池中,等待新任务)

  5. 总结:ThreadPool性能会好于Thread,但是ThreadPool与Thread对线程的控制都不是很够,例如线程等待(线程执行一段时间无响应后,直接停止线程,释放资源,两者都没有直接的API,只能通过硬编码实现)。同时ThreadPool使用的是线程池全局队列,全局队列中的线程,依旧会存在竞争共享资源的情况,从而影响性能。


下面说Task

  1. Task背后的实现,也是使用的是线程池线程。但是它的性能优于ThreadPool,因为它使用的不是线程池的全局队列,而是使用的是本地队列。是的线程之间竞争资源的情况减少。

  2. Task提供了丰富的API,开发者可对Task进行多种管理,控制。


详情可以参考我的博客:http://www.cnblogs.com/color-wolf/p/4850869.html

也可以参考:CLR via C#(第4版)

MR__J_A_Y_
2016-04-01 · TA获得超过637个赞
知道小有建树答主
回答量:747
采纳率:50%
帮助的人:288万
展开全部
task是任务,tread是线程,threadpool是线程池,你直接搜这三个名词就能给你解释。相关文章多的是。
copy一份给你:
Thread就是Thread,需要自己调度,适合长跑型的操作。

ThreadPool是Thread基础上的一个线程池,目的是减少频繁创建线程的开销。线程很贵,要开新的stack,要增加CPU上下文切换,所以ThreadPool适合频繁、短期执行的小操作。调度算法是自适应的,会根据程序执行的模式调整配置,通常不需要自己调度线程。另外分为Worker和IO两个池。IO线程对应Native的overlapped io,Win下利用IO完成端口实现非阻塞IO。

Task或者说TPL是一个更上层的封装,NB之处在于continuation。continuation的意义在于:高性能的程序通常都是跑在IO边界或者UI事件的边界上的,TPL的continuation可以更方便的写这种高scalability的代码。Task会根据一些flag,比如是不是long-running来决定底层用Thread还是ThreadPool,另外也做了些细节优化,比如同一个线程跑好几个Task,比如continuation时根据情况让CPU空转几毫秒来等待前置Task结束,都是为了减少CPU上下文切换。

结论:能用Task就用Task,底下都是用的Thread或者ThreadPool。但是要注意细节,比如告诉Task是不是long-running;比如尽量别Wait;再比如IO之后的continuation要尽快结束然后把线程还回去,有事开个Worker做,要不然会影响后面的IO,等等。

作者:权然
链接:http://www.zhihu.com/question/24911536/answer/50534592
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式