线程,托管线程池,前台线程,后台线程
#一.线程# 操作系统使用进程将他们正在执行的不同应用程序分开。线程是操作系统分配处理器时间的基本单元,并且进程中可以有多个线程同时执行代码。每个线程都维护异常处理程序,调度优先级和一组系统用于在调度该线程前保存线程上下文的结构。线程上下文包括为使线程在线程的宿主进程地址空间中无缝地继续执行所需的所有信息,包括线程的CPU寄存器组合堆栈。
.Net Framework将操作系统进程进一步细分为由System.AppDomain表示的,称为应用程序域的轻量托管子进程。一个或多个托管线程(由System.Threading.Thread表示)可以在同一个托管进程中的一个或任意数目的应用程序域中运行。虽然每个应用程序域都是用单个线程启动的,但该应用程序域中的代码可以创建附加应用程序域和附加线程。其结果是托管线程可以在同一个非托管进程中的应用程序域之间自由移动;您可能只有一个线程在若干应用程序域之间移动。
支持抢先多任务处理的操作系统可以创建多个进程中的多个线程同时执行的效果。它通过以下方式实现这一点:在需要处理器时间的线程之间分割可用处理器时间,并轮流为每个线程分配处理器时间片。当前执行的线程在其时间片结束时被挂起,而另一个线程继续运行。当系统从一个线程切换到另一个线程时,它将保存被抢先的线程的线程上下文,并重新加载线程队列中下一个线程的已保存线程上下文。
时间片的长度取决于操作系统和处理器。由于每个时间片都很小,因此即使只有一个处理器,多个线程看起来似乎也是在同时执行。这实际上就是多处理器系统中发生的情形,在此类系统中,可执行线程分布在多个可用处理器中。
##多线程优点## 单个应用程序域可以使用多个线程完成以下任务
- 通过网络和Web服务器和数据库通信
- 执行占用大量时间的操作
- 区分具有不同优先级的任务。例如,高优先级线程管理时间关键的任务,低优先级线程执行其他任务。
- 使用户界面可以在将时间分配给后台任务时仍能快速做出响应。
##多线程缺点## 线程处理还具有在设计应用程序时要考虑的资源要求和潜在冲突。这些资源要求如下所述:
- 系统将为进程,AppDomain对象和线程所需的上下文信息使用内存。因此,可以创建的进程,AppDomain对象和线程的数目可受到可用内存的限制。
- 跟踪大量的线程将占用大量的处理器时间。如果线程过多,则其中大多数线程都不会产生明显的进度。如果大多数当前线程处于一个进程中,则其他进程中的线程的调度频率就会很低。
- 使用许多线程控制代码执行非常复杂,并可能产生许多bug。
- 销毁线程需要了解可能发生的问题并对那些问题进行处理。
- #二.托管线程池#
##1.托管线程池定义##
定义: ThreadPool类为你的应用程序提供一个受系统管理的辅助线程池,从而使你能够专注于应用程序任务,而非线程管理。如果有需要后台处理的短任务,托管的线程池则为利用多个线程的简便方法。 用途:.Net FrameWork 将线程池用于多种用途,包括异步I/O完成,计时器回调,注册的等待操作,使用委托的异步方法调用和System.Net套接字连接。 ##2.托管线程池特征## 线程池线程是后台线程。每个线程均使用默认的堆栈大小,以默认的优先级运行,并且位于多线程单元中。每个进程只有一个线程池。 最大线程池线程数:可排入线程池的操作的数量仅受可用内存限制;从.Net Framework4 开始,进程线程池的默认大小取决于若干因素,例如虚拟地址空间的大小。可以用GetMaxThreads和SetMaxThreads方法来控制最大线程数。
线程池最小值:线程池根据需要提供的工作线程或I/O完成线程.直到它达到每个类别的指定最小值。可以使用GetMinThreads方法获取最小值.
3.何时不使用线程池线程?
以下几种情况适合创建并管理自己的线程,而非使用线程池线程:
- 需要一个前台线程
- 需要具有特定优先级的线程
- 拥有会导致线程长时间阻塞的任务。线程池具有最大线程数,因此大量被阻塞的线程池线程可能会组织任务启动。
- 需将线程放入单线程单元。所有ThreadPool线程均位于多线程单元中.
- 需具有与线程关联的稳定标识,或需将一个线程专用于一项任务.
##4.线程池异常##
线程池线程上未经处理的异常将终止该进程。以下三种是例外:
1.ThreadAbortException在线程池线程中引发,因为调用了Abort. 2.AppDomainUnloadedException在线程池线程中引发,因为正在卸载应用程序域。 3.公共语言运行时或主机进程将终止该线程. #三.前台线程,后台线程# ##1.特征## 托管线程有可能是后台线程,也有可能是前台线程。后台线程不会使托管执行环境处于运行状态,除此之外,后台线程和前台线程是一样的。一旦所有前台线程在托管进程(其中.exe文件是托管程序集)中被停止,系统将停止所有后台线程并关闭。线程的前台和后台状态不影响线程中未经处理的异常的结果。 ##2.哪些是前台线程,哪些是后台线程?## 属于托管线程池的线程(即其IsThreadPoolThread属性为true的线程)是后台线程.从非托管代码进入托管执行环境的所有线程都被标记为后台线程.通过创建并启动新的Thread对象而生成的所有线程都默认为前台线程.