当我应该 使用的线程池。净?

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

什么是您的经验,围绕这个吗?

有帮助吗?

解决方案

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

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

P.S.: MSDN文章 "托管线的游泳池" 包含一个章节, "时,不要用线程池", 与一个非常类似但稍微更加完整的清单的可能的原因不使用该线的游泳池。

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

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

其他提示

@Eric,我要赞同院长。线程是昂贵的。你不能想当然地认为你的计划是唯一一个在运行。当每个人都是贪婪的资源,问题乘.

我喜欢我的螺纹手动和控制他们自己。它使代码很容易理解的。

那很好,当它是合适的。如果你需要一堆的工线,不过,你所做的就是让你的代码变得更加复杂。现在你必须写的代码来管理他们。如果你只是使用一线的游泳池,你就会得到的所有线管理免费。和该线的游泳池提供的语言是非常可能更强大、更有效率和较少的车比什么你滚自己。

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

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

人们太害怕的资源使用的螺纹。我从未见过的创建和启动一个线程采取更多比一毫秒。没有硬限制在线程的数量可以创建。RAM的使用是最小的。一旦你有几百线,CPU成为一个问题,因为方面开关,因此在这一点上你可能想要获得幻想与你的设计。

一毫秒是 时间在现代化的硬件。这是3万次在3GHz机。再次,你是不是唯一一个创造线。你的线的竞争CPU沿着与每一个其他程序的螺纹。如果使用不太多线程,以及这样做的另一个程序,然后在一起,你用了太多线程。

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

确实如此。不要让生活更加复杂。如果你的程序需要多工线,不要重新发明车轮。使用该线的游泳池。这就是为什么它的存在。你滚你自己串类?

线的游泳池有意义的,只要你有的概念,工作人员的螺纹。任何时间你可以很容易地分区处理入较小的工作岗位,每个可独立处理,工人的线(和因此,一线的游泳池)有意义的。

线的游泳池没有意义的,当你需要线,其执行完全不同的和不相关的行动,这些行动不能被认为是"就业";例如,一个线程GUI事件处理,另一个为后台处理。线的游泳池还没有意义的处理时形成一个管道。

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

到争吵的回答,我想补充一点,最好不要使用一个线程池线的如果你需要保证你的线将开始工作。最大数量的运行线汇集线是有限的每域,所以你一块工作可能需要等待,如果他们都忙。这就是所谓的"用户队列工作项目",在此之后所有。

两个需要注意的事项:

  1. 你可以改变的最大数量的线汇集程代码,在运行时,所以没有什么可以阻止你检查当前vs最大数量,并增加最大的,如果需要的话。
  2. 纺丝立一个新的螺纹配备其自身时间上的损失-它是否值得你采取的打击取决于你的情况。

我不说因为有人只有 理论知识在这里。我写信 并保持高容量的应用程序 这使大量使用多线程, 我通常不会找到线 游泳池是正确的答案。

啊,论,从权力机构,但总是在寻找的人可能在窗户内核团队。

我们既不是争论的事实,如果你有一些具体要求,然后。净线程池可能不是正确的事情。我们反对是trivialisation的成本的机器建立一个线程。

重大牺牲创造一个在线存在的理由的线程池放在第一位。我不想我的机会充满了代码写的人被误导有关的费用创造一个线,不要,例如,知道它会导致一种方法被称为每个DLL其附处理(一些这将是创建的第3次缔约方),这很可能热负荷的代码不需要在RAM在所有,几乎肯定不需要在L1。

形状的层次结构的存在一个现代化的机意味着'分散注意力'的CPU是最糟糕的事情可以做,有人关心他们的工艺应该努力工作,以避免它。

当你要执行的操作是需要很长一段时间,或也许是一个连续的背景线。我猜你可以一直推动的金额的线可以在游泳池,但会有一点点在承担管理费用的一线是永远不会回到游泳池。

MSDN有一个列表中的一些原因:

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

有几个场景中,这是适当的创建和 管理自己的线而不是使用线的游泳池线程:

  • 你需要一个前线。
  • 你需要一个线程具有特定的优先事项。
  • 你有任务,导致线块很长一段时间。该线的游泳池有一个线程的最大数目,这样大 数量的封锁线的游泳池线可能会阻止任务 启动。
  • 你需要把线放入一个单一的螺纹套公寓。所有的线程池线是多线程的公寓。
  • 你需要有一个稳定的身份相关线,或奉献程的任务。

线程池线是适当的任务,同时满足以下标准:

  1. 该任务将不需要花费任何显着的时间等待发生的事情
  2. 任何东西等待的任务的完成将可能在等待着许多任务要完成,因此其调度的优先权是不容易影响的事情很多。

使用一个线程池线而不是创建一个新的会保存一个重要但有界量时间。如果时间是重大的与时间相比,它将采取执行任务,一个线程池的任务可能是适当的。长所需的时间执行任务,但是,较小的好处使用在线程池和更大的可能性的任务,妨碍线程池的效率。

@埃里克

@德里克,我不完全同意方案使用作为一个例子。如果你不知道究竟什么是上运行的机器,并究竟总共有多少线处理,CPU时,拉姆,等等,那你的应用程序将使用在一定的负载量,你有麻烦了。

是你唯一的目标客户的程序,你写的?如果不是,你不能确定有关的大多数。你一般不知道当你写的程序是否将执行有效的个人,或者如果它运行的一个网络服务器正在敲定由一个DDOS攻击。你不可能知道有多少CPU时间你会有的。

假设你的程序的行为变化的基础上输入,也很少甚至不知道到底有多少存储器或CPU时间你的计划将消耗。当然,你应该有一个很好的想法关于你的计划是要去的行为,但大多数程序都从未进行分析,以确定到底有多少存储器,有多少处理,等等。将被使用,因为一个充分分析是昂贵的。如果你不是写实时的软件,支付并不是价值的努力。

在一般情况下,声称以确切地知道如何你计划的行为是牵强,并声称知道的一切有关机办法的荒谬的。

而且说实话,如果你不知道究竟什么方法你应该使用:手册线,线的游泳池、代表、以及如何实现它来做什么你的应用程序的需要,你有麻烦了。

我不完全同意,但是我真的不怎么看这就是相关的。这个网站是在这里,特别是因为程序员不总是有所有的答案。

如果应用程序是足够复杂,需要限制人数的线使用,是不是你几乎总是想要更多的控制过什么的框架给你吗?

没有。如果我需要一个线的游泳池,我将使用一个提供,除非和直到我发现,这是不够的。我不会只是假设所提供的线的游泳池是不足为我需要确认的情况下。

我不说因为有人只有理论知识在这里。我写和维持高容量的应用程序,使大量使用多线程,以及我通常不会找到的线的游泳池是正确的答案。

我的大多数专业经验已经与多线程和处理程序。我经常需要滚是我自己的解决方案。这并不意味着该线的游泳池是不是有用的,或者适当时在许多情况下。该线的游泳池是建立处理工作人员的螺纹。在情况下的多个工作线是适当的,所提供的线的游泳池应一般应于第一种方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top