本节书摘来自华章出版社《C#多线程编程实战(原书第2版)》一书中的第3章,第3.4节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3.4 线程池与并行度
本节将展示线程池如何工作于大量的异步操作,以及它与创建大量单独的线程的方式有何不同。
3.4.1 准备工作
为了学习本节,你需要安装Visual Studio 2015。除此之外无需其他准备。本节的源代码放置在BookSamplesChapter3Recipe3目录中。
3.4.2 实现方式
请执行以下步骤来了解线程池如何工作于大量的异步操作,以及它与创建大量单独的线程的方式的不同之处:
1.启动Visual Studio 2015。新建一个C#控制台应用程序项目。
2.在Program.cs文件中加入以下using指令:
![dd0d36aee8406166533456d410262f441887104b](https://i-blog.csdnimg.cn/blog_migrate/5a0ff687a59f651cc31caa4d6fce82f9.png)
3.在Main方法下面加入以下代码片段:
![7437f3d6b792bc0e1b135198938af984f795f2f6](https://i-blog.csdnimg.cn/blog_migrate/fa41bdf82aca17eb864ace74a932f3b1.png)
![0208c1b0a47f9f4fa0c701259b710e9cfef22f74](https://i-blog.csdnimg.cn/blog_migrate/abf0eeaffcce756ba631f3723a2ea02f.png)
4.在Main方法中加入以下代码片段:
![78d8ca03d9250fae81a7cfc9df88b6d4fad1c009](https://i-blog.csdnimg.cn/blog_migrate/cc1cee7cd2351c2e2ecfe13b661c32e9.png)
5.运行程序。
3.4.3 工作原理
当主程序启动时,创建了很多不同的线程,每个线程都运行一个操作。该操作打印出线程ID并阻塞线程100毫秒。结果我们创建了500个线程,全部并行运行这些操作。虽然在我的机器上的总耗时是300毫秒,但是所有线程消耗了大量的操作系统资源。
然后我们使用同样的工作流,只不过不为每个操作创建一个线程,而将它们放入到线程池中。然后线程池开始执行这些操作。线程池在快结束时创建更多的线程,但是仍然花费了更多的时间,在我的机器上是12秒。我们为操作系统节省了内存和线程数,但是为此付出了更长的执行时间。