我什么时候不应该使用.NET中的线程池? [关闭](When should I not use

2019-06-23 21:09发布

我什么时候应该使用.NET中的线程池?

它看起来像最好的选择是使用一个线程池,在这种情况下,为什么它不是唯一的选择?

你有什么解决此经验?

Answer 1:

为什么我不会使用的唯一原因ThreadPool便宜多线程是,如果我需要...

  1. 该方法的运行interract(例如,杀死它)
  2. 上运行代码STA线程 (这发生在我身上)
  3. 保持线程活着我的应用程序已经死了之后( ThreadPool线程后台线程)
  4. 在情况下,我需要改变线程的优先级。 我们不能在线程池默认情况下是正常更改线程的优先级。

PS:MSDN文章“托管线程池”包含标题为一节,“何时不使用线程池中的线程”,具有非常相似但略有更完整的不使用线程池可能的原因列表。

有很多的,你为什么会需要跳过的原因ThreadPool ,但是如果你不知道他们那么ThreadPool应该是对你不够好。

或者,看看新的并行扩展框架 ,其中有一些巧妙的东西在里面,可能满足您的需求,而无需使用ThreadPool



Answer 2:

@Eric,我要和院长同意。 线程是昂贵的。 你不能想当然地认为你的程序是唯一一个运行。 当所有人贪婪的资源,问题相乘。

我更喜欢手动创建我的主题和控制他们自己。 这使得代码非常容易理解。

这很好,当它是适当的。 如果你需要一帮工作线程,不过,你所做的一切就是让你的代码变得更加复杂。 现在,你必须编写代码来管理它们。 如果你只使用一个线程池,你会得到所有的线程管理是免费的。 并通过语言提供的线程池很可能比你滚你自己什么更强劲,更高效,bug更少。

 Thread t = new Thread(new ThreadStart(DoSomething)); t.Start(); t.Join(); 

我希望你通常有一些额外的代码之间Start()Join() 否则,额外的线程是没用的,你就是在浪费资源,没有理由。

人们实在是太害怕被线程使用的资源。 我从来没有见过创建和启动一个线程需要超过一毫秒以上。 这里是你可以创建的线程数量没有硬性限制。 RAM使用是最小的。 一旦你有几百个线程,CPU变成因为上下文切换的问题,所以在这一点上,你可能想获得幻想你的设计。

一毫秒的时间很长的现代化的硬件。 这是一个3GHz的机器3万次。 再次,你是不是唯一一个创建线程。 你的线程竞争与其他所有程序的线程沿着CPU。 如果您使用的不是,很太多线程,也是如此另一个程序,然后一起你已经使用了太多的线程。

说真的,比它需要的是不要让生活变得更加复杂。 除非你需要非常具体的,它提供的东西,不要使用线程池。

确实。 不要让生活更复杂。 如果你的程序需要多个工作线程,不推倒重来。 使用线程池。 这就是为什么它的存在。 你会推出自己的字符串类?



Answer 3:

线程池的意义,只要你有工作线程的概念。 任何时候,你可以很容易地加工分割成更小的工作,每一个都可以被独立处理,工作线程(因此线程池)是有意义的。

当你需要它执行完全不同的和无关的行为,这不能被认为是“工作”线程的线程池没有意义; 例如,对于GUI事件一个线程处理,另一个用于后端处理。 线程池也加工时形成的管道没有意义。

基本上,如果你有启动线程,处理工作,并退出,线程池可能是要走的路。 否则,线程池是不是真的要帮助。



Answer 4:

要争吵的答案,我想补充一点,这是最好的,如果你需要保证你的线程将立即开始工作,不使用线程池线程。 正在运行的线程池化的最大线程数每个AppDomain是有限的,所以你的工作件可能需要等待,如果他们都很忙。 这就是所谓的“队列用户工作项目”,毕竟。

两个警告当然:

  1. 您可以更改线程池的最大线程数的代码,在运行时,所以没有什么阻止你检查当前VS最大数量,并在必要加大了最大值。
  2. 纺纱一个新的线程都有自己的时间惩罚 - 不管是值得你拿命中取决于你的情况。


Answer 5:

我不是说有人在这里只有理论知识。 我编写和维护的大批量应用,使大量使用多线程的,我一般没有找到线程池是正确答案。

啊,诉诸权威 - 但始终看出来的人谁可能会在Windows内核团队。

我们都不是一个事实,即如果你有一些特殊要求,则.NET线程池可能不是正确的事情争吵。 我们现在反对的是成本,创建线程的机器trivialisation。

在存在的理由在首位的线程池创建线程的显著费用。 我不希望我的机器充满了谁已经被误导有关创建线程的开销,并且没有,例如人编写的代码,知道它导致了一种方法,每一个DLL这是被称为连接到进程(其中一些将会由第三方创建),并且这很可能热起来的代码不必放在RAM的一切,几乎可以肯定没有需要在L1的负载。

在现代机器的内存层次结构的形状意味着“分心”一个CPU大约是你能做谁在乎自己的手艺应该努力避免最糟糕的事情,每个人都。



Answer 6:

当你要执行将要花费很长的时间,或者是一个连续的后台线程的操作。 我想你可以一直推入池中,直到可用线程的数量,但是会有小点招致线程的管理成本是永远不会被归还给池。



Answer 7:

MSDN有一个列表的一些原因在这里:

http://msdn.microsoft.com/en-us/library/0ka9477y.aspx

有几种方案中,它是适当的创建和管理自己的线程,而不是使用线程池中的线程:

  • 你需要一个前台线程。
  • 你需要一个线程具有特定的优先级。
  • 您有导致线程阻塞很长一段时间的任务。 线程池拥有的最大线程数,所以大量阻塞线程池中的线程可能会阻止任务启动。
  • 您需要将线程进入一个单线程单元。 所有的线程池线程在多线程单元。
  • 你需要有与线程关联稳定的身份,或以奉献一个线程的任务。


Answer 8:

线程池线程既满足下列条件的任务是适当的:

  1. 该任务将不会花费任何显著的时间等待事情发生
  2. 凡是在等待完成很可能会等待许多任务要完成这个任务,所以它的调度优先级是不容易的事情影响很大。

使用线程池线程,而不是创建一个新的节省时间的显著但有界量。 如果它需要执行任务的时间相比,时间是显著,线程池的任务可能是合适的。 然而,执行任务所需的时间越长,任务阻碍线程池效率的可能性使用线程池的利益越小,越大。



Answer 9:

@Eric

@Derek,我完全不与你为榜样使用方案达成一致。 如果你不知道到底发生了什么你的机器上运行,到底有多少总线程,处理,CPU时间,内存等,您的应用程序将在一定的负载量使用,你有麻烦了。

你是唯一的目标客户为你写的程序? 如果没有,你无法确定有关大多认为。 通常你不知道,当你写一个程序是否会执行有效独奏,或是否会在网络服务器上运行被DDOS攻击重创。 你可以不知道你要多少CPU时间有。

基于输入假设你的程序的行为变化,也很少甚至不知道你的程序到底有多少内存或CPU时间消耗。 当然,你应该对你的程序将如何表现一个不错的主意,但大多数程序都从未进行分析,以确定到底有多少内存,多少柄等将被使用,因为一个完整的分析是昂贵的。 如果你不写实时软件,回报是不值得的。

在一般情况下,自称知道你的程序的行为完全是如何牵强,并声称知道的一切关于机器接近可笑。

坦白地说,如果你不知道你应该用什么方法:手动线程,线程池,代表,以及如何实现它做的正是你的应用需求,你有麻烦了。

我不完全同意,但我实在不明白如何与自己相关。 这个网站是专门在这里因为程序员并不总是知道所有的答案。

如果你的应用是足够复杂到需要节流您使用的线程数,不是你几乎总是会想比框架为您提供了更多的控制权?

不,如果我需要一个线程池,我将使用商提供的,除非和直到我发现,这是不够的人。 我不会简单地认为所提供的线程池不足以满足我的需求没有确认是这种情况。

我不是说有人在这里只有理论知识。 我编写和维护的大批量应用,使大量使用多线程的,我一般没有找到线程池是正确答案。

我的大部分专业经验已经与多线程和多程序。 我经常需要推出自己的解决方案,以及。 这并不意味着线程池是不是在很多情况下是有用的,或适当的。 线程池是为处理工作线程。 在多个工作线程是适当的情况下,所提供的线程池应一般应第一种方法。



文章来源: When should I not use the ThreadPool in .Net? [closed]