为什么使用 ThreadPool 比基于线程的方法有优势?

why use ThreadPool has advantages over thread-based approach?

我的教科书说:

should you need to run hundreds or thousands of concurrent I/O-bound operations, a thread-based approach consumes hundreds or thousands of MB of memory purely in thread overhead.

when running multiple long-running tasks in parallel, performance can suffer, then a thread-based approach is better

我很困惑,非线程池线程的开销和线程池线程的开销有什么区别?与 I/O-bound 相关的开销如何?

最后,为什么基于线程的方法(例如,使用 new Thread(runMethod).Start())更适合长 运行 任务?

ThreadPool 可重复使用的线程数量有限。此线程用于任务(例如 Task.Run)。执行时间较长的任务会阻塞一个线程,因此它不能被另一个 Task 重用。因此,为了始终有足够的 ThreadPool 个可用线程(例如 async/await、Parallel Linq 等),您应该为此类任务使用 ThreadPool 个独立线程。
您可以通过使用 Task.Factory.StartNew(Action, TaskCreationOptions)(或接受 TaskCreationOptions 对象的任何其他重载)然后传入参数 TaskCreationOptions.LongRunning 来执行此操作。 LongRunning 强制一个独立于 ThreadPool 的新线程。

因此对于所有长 运行 和基于 IO 的任务,例如读取文件或数据库,您应该通过调用 Task.Factory.StartNew(() => DoAction(), TaskCreationOptions.LongRunning); 使用 ThreadPool 个独立线程。你根本不需要 new Thread(runMethod).Start()

ThreadPool 线程的资源效率更高,因为它们是可重用的。所以当检索 ThreadPool 个线程时,它们已经被创建了。创建新线程总是占用大量资源。它们需要注册,必须创建调用堆栈,必须复制局部变量等。这就是为什么在考虑性能时,可重用线程是更可取的选择,只要工作负载是轻量级的(short 运行)。