[第1篇] 什么是线程池
到目前为止我们使用多线程应用程序的目的是尽可能多地使用计算机处理器资源。所以,看起来我们仅需要为每个独立的任务分配一个不同的线程,并让处理器确定在任何时间它总会处理其中的某一个任务。额,对小系统来说这样做很好。但是当系统越来越复杂时,线程的数量也会越来越多,操作系统将会花费更多时间处理锁分配,理清线程之间的关系,处理程序指令的时间实际上是很少的。为了让我们的程序具备可扩展性,我们将不得不对线程进行一些控制。
[第2篇] CLR 和 线程
设计CLR 的目的是创建一个提供多种服务(比如编译、垃圾回收、内存管理以及基于.NET 平台的线程池技术)的托管代码环境。
当然,Win32 平台和.NET Framework 平台在定义我们的应用程序使用的用来作为线程宿主的进程方面是不同的。在传统Win32 应用程序中,每个进程都由一个线程集合组成。如果一台机器仅有一个CPU,那么每个线程都要与其他线程交换线程本地存储和调用堆栈以实现时间轮转。单一处理器基于线程优先级来为每个线程分配时间片。当一个特定线程的时间片用完以后,它会被暂停执行同时其他线程被允许执行它的任务。在.NET Framework 中,每个Win32 进程都被逻辑上划分为同时寄宿线程、TLS以及调用堆栈的应用程序域。值得一提的是应用程序域间的通信由.NET Framework 中一个称为Remoting 的技术处理。
到目前为止,我们已经有了关于线程池和.NET 进程的基本概念,让我们进一步看看CLR 是如何为.NET 应用程序提供线程池功能的。
[第3篇] 剖析ThreadPool 类
在这部分,我们将查看ThreadPool 类的多个方面并学习如何在我们的.NET 应用程序中使用ThreadPool 类的内容创建线程池。ThreadPool 类提供的线程可以用来做以下事情:
1. 处理工作组件
2. 处理异步I/O 调用
3. 处理定时器
4. 等待其他线程
[第4篇] 在C#中使用线程池
本章的之前部分内容主要介绍如何在.NET Framework 中使用线程池的概念。现在我们要介绍如何使用C# 实现创建并使用线程池的.NET 应用程序。如之前描述的那样,System.Threading 命名空间中包含的ThreadPool 类可以被用于在.NET 应用程序中创建一个线程池。
在我们真正编码之前,我们必须对ThreadPool 类中的两个重要规则非常清楚。分别是:
1. 每个应用程序域中只能有一个ThreadPool 对象
2. 我们第一次调用ThreadPool.QueueUserWorkItem() 方法时会创建一个ThreadPool 对象,通过一个定时器或者注册的等待操作调用的回调方法(内部使用应用程序域的线程池)也可以创建一个ThreadPool 对象。
[第5篇] 一个多线程微软消息队列(MSMQ)监听器
在这部分,我们将使用ThreadPool 和MSMQ 进行消息收发。MSMQ 是一个分布式队列,通过MSMQ 一个应用程序可以异步地与另外一个应用程序通信。
[第6篇] .NET 中的扩展性
如果你有一个多处理器系统,那么你将有机会体验到线程真正的价值。Windows 操作系统负责向处理器分配线程,正如你在本书中看到的那样,启动一个进程会自动运行一个线程。.NET Framework 不提供细粒度的处理器分配控制,而是允许操作系统控制调度,这是由于操作系统比CLR 更加了解处理器的负载。CLR 负责提供一些诸如整个进程运行在哪个处理器上的控制。然而,一个进程中的所有线程都会运行在一个处理器上,控制进程中的线程运行在哪个处理器上的内容不会在本书中介绍。