并发编程 ---为何要线程池化
💡
原文中文,约3700字,阅读约需9分钟。
📝
内容提要
线程的开销包括空间和时间开销,空间开销来自线程内核对象、环境块和栈,时间开销来自创建、DLLMain方法调用和上下文切换。为了避免滥用线程,引入了线程池和BackgroundWorker。Task替代了ThreadPool,具有更高级的抽象、强大的异步编程支持、更好的性能和资源管理、任务关联和组合功能,以及更好的异常处理和取消支持机制。推荐使用Task来处理并发任务。
🎯
关键要点
- 线程的开销包括空间和时间开销,空间开销来自线程内核对象、环境块和栈,时间开销来自创建、DLLMain方法调用和上下文切换。
- 线程的空间开销包括线程内核对象、线程环境块、用户模式栈和内核模式栈。
- 线程的时间开销涉及线程创建、DLLMain方法调用和线程上下文切换,后者是一个复杂的过程。
- 无节制使用线程会严重影响性能,因此引入了线程池技术来管理工作线程。
- 线程池技术允许CLR管理线程的生命周期,避免频繁创建和销毁线程。
- BackgroundWorker是基于线程池的技术,提供了与UI线程的交互能力,包括报告进度和取消任务。
- Task类替代了ThreadPool,提供更高级的抽象和强大的异步编程支持。
- Task提供了更好的性能和资源管理、任务关联和组合功能,以及更好的异常处理和取消支持机制。
- 在C#编程中,推荐优先使用Task来处理并发任务。
➡️