我在前些天读到,对于长时间运行的任务,我最好的选择是手动创建线程,而不是使用.NET的线程池或Task Parallel。当我学习c#线程时,我真的很喜欢有人给我启发,特别是对于长时间运行的IO任务。先谢谢你。确实,对于长时间运行的进程,最好是手动执行线程而不是线程池?
回答
你说得对,ThreadPool线程既轻便又便宜,因为可以重新调度来为ThreadPool提供新的请求,所以只要线程操作完成,ThreadPool就可以重新调度同一个线程进行其他操作,也可以操作通过最低线程数(ThreadPool.SetMinThreads()),所以那些将会一直活着直到新的请求到来。所以这对于多个轻量级操作来说是一个很好的解决方案,例如您需要每隔几秒创建一个单独的/新的线程。
在MSDN杂志一篇非常好的文章:Dedicated thread or a Threadpool thread?
一旦达到的最小线程数,线程池的目的是 限制正在创建每500毫秒一个线程数。 这是一个智能机制,避免了在该时间段内发布多个线程池线程时可能会创建新线程的昂贵成本 。
由于.NET 4.0 - 任务并行库是一个很好的高级抽象和手动线程管理和同步的替代方案,因此您的代码将不太容易出错。所以只需create a Task与TaskCreationOptions.LongRunning,我相信这将是从维护角度来看应用架构中最好的投资。
有用的书:
非常感谢您的指导。 – user1193665 2012-04-26 07:55:30
这是事实。线程池针对小型工作单元进行了优化,您可以通过保持线程池线程来干涉其他工作。
我的经验法则是,如果一个操作可能需要一秒以上,它不应该在线程池线程上。这可能相当长。
虽然这是没有记录的,但如果你用启动Task
,那么将启动一个新的线程来运行任务。
对于大多数IO任务,您应该真正使用异步版本的框架方法。这些使用内核函数并且意味着你不会阻塞任何线程。
与往常一样,我建议您阅读Joe Albahari's free ebook, ,然后是Joe Duffy's Concurrent Programming on Windows。后者是1000页长,但充满了有用的细节。
我会使用的标准是线程是否需要花费任何重要的时间来“等待”发生的事情,或者执行另一个线程可能正在等待的某个特定操作。 – supercat 2013-04-30 21:01:09
- 1. 执行并行线程池
- 2. 线程池是否按顺序运行?
- 3. Android中的线程处理长时间运行的进程
- 4. Python:长时间运行后台进程的spawn或线程?
- 5. 对于长时间运行的线程使用ThreadPool的缺点
- 6. 线程池是否可以在单线程函数上运行?
- 7. 试图与tkinter(tkinter是在主线程上)运行线程执行任务,而是它停止主线程
- 8. 线程池运行为了
- 9. 用于运行可执行文件的python多线程进程
- 10. 什么是阻止线程池运行的好方法?
- 11. python多线程长线程运行
- 12. 执行多线程进程
- 13. C++线程运行时间
- 14. 执行程序创建的线程池是否释放内存?
- 15. 是在Android的进程的线程池中的UI线程?
- 16. Java多线程:执行对象方法的线程是否依赖于创建它的线程上的线程?
- 17. 执行的线程(不是线程组)JMeter的顺序
- 18. 确定不同线程的线程和IO访问的执行时间
- 19. 新手问题关于在新线程上运行进程
- 20. ASP.NET + WCF下的长时间运行线程程序
- 21. 用于联网的Python线程 - 线程不能并行运行
- 22. 你可以选择线程池中的线程来执行(boost)
- 23. 在C#中的线程池类管理线程执行
- 24. C++线程池中的线程执行顺序
- 25. 的Java执行器服务线程池
- 26. 子进程是否总是在父进程内运行?是否...线程...?
- 27. 在``C``线程池中运行'POSIX`线程在``C``线程池中运行`函数指针`
- 28. 长时间运行的主线程脚本是否阻止滚动画?
- 29. Python暂停线程,手动执行并重置时间
- 30. .Net MVC线程长时间运行过程
查看此问题:http://stackoverflow.com/questions/230003/thread-vs-threadpool – 2012-04-24 13:20:34