并发编程 ---为何要线程池化

💡 原文中文,约3700字,阅读约需9分钟。
📝

内容提要

线程的开销包括空间和时间开销,空间开销来自线程内核对象、环境块和栈,时间开销来自创建、DLLMain方法调用和上下文切换。为了避免滥用线程,引入了线程池和BackgroundWorker。Task替代了ThreadPool,具有更高级的抽象、强大的异步编程支持、更好的性能和资源管理、任务关联和组合功能,以及更好的异常处理和取消支持机制。推荐使用Task来处理并发任务。

🎯

关键要点

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

继续阅读