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