2012-04-24 59 views
13

我在前些天读到,对于长时间运行的任务,我最好的选择是手动创建线程,而不是使用.NET的线程池或Task Parallel。当我学习c#线程时,我真的很喜欢有人给我启发,特别是对于长时间运行的IO任务。先谢谢你。确实,对于长时间运行的进程,最好是手动执行线程而不是线程池?

+1

查看此问题:http://stackoverflow.com/questions/230003/thread-vs-threadpool – 2012-04-24 13:20:34

回答

7

你说得对,ThreadPool线程既轻便又便宜,因为可以重新调度来为ThreadPool提供新的请求,所以只要线程操作完成,ThreadPool就可以重新调度同一个线程进行其他操作,也可以操作通过最低线程数(ThreadPool.SetMinThreads()),所以那些将会一直活着直到新的请求到来。所以这对于多个轻量级操作来说是一个很好的解决方案,例如您需要每隔几秒创建一个单独的/新的线程。

在MSDN杂志一篇非常好的文章:Dedicated thread or a Threadpool thread?

一旦达到的最小线程数,线程池的目的是 限制正在创建每500毫秒一个线程数。 这是一个智能机制,避免了在该时间段内发布多个线程池线程时可能会创建新线程的昂贵成本 。

由于.NET 4.0 - 任务并行库是一个很好的高级抽象和手动线程管理和同步的替代方案,因此您的代码将不太容易出错。所以只需create a TaskTaskCreationOptions.LongRunning,我相信这将是从维护角度来看应用架构中最好的投资。

有用的书:

+0

非常感谢您的指导。 – user1193665 2012-04-26 07:55:30

14

这是事实。线程池针对小型工作单元进行了优化,您可以通过保持线程池线程来干涉其他工作。

我的经验法则是,如果一个操作可能需要一秒以上,它不应该在线程池线程上。这可能相当长。

虽然这是没有记录的,但如果你用​​启动Task,那么将启动一个新的线程来运行任务。

对于大多数IO任务,您应该真正使用异步版本的框架方法。这些使用内核函数并且意味着你不会阻塞任何线程。

与往常一样,我建议您阅读Joe Albahari's free ebook, ,然后是Joe Duffy's Concurrent Programming on Windows。后者是1000页长,但充满了有用的细节。

+0

我会使用的标准是线程是否需要花费任何重要的时间来“等待”发生的事情,或者执行另一个线程可能正在等待的某个特定操作。 – supercat 2013-04-30 21:01:09

相关问题