5.使用程序集属性向元数据添加自定义信息
进程:任何应用程序在执行期间都被称为一个进程
线程:线程是一个执行单元。 每个进程至少要包含一个线程。
用于直接管理线程的主要类是 Thread 类
衍生新线程 :创建线程的过程
使线程进入休眠状态 :销毁一个现有线程的过程称为注销或终止线程,暂停线程的过程
构造函数:构造函数用于初始化 Thread 类的新实例。Thread 类具有以下构造函数:
Thread(ThreadStart):初始化 Thread 类的新实例。
Thread(ParameterizedThreadStart):初始化 Thread 类的新实例,指定允许在启动线程时将对象传递给线程的委托。
Thread(ThreadStart, Int32):初始化 Thread 类的新实例,指定线程的最大堆栈大小。
Thread(ParameterizedThreadStart, Int32):初始化 Thread 类的新实例,指定允许在线程启动时将对象传递给线程的委托,并指定线程的最大堆栈大小。
CurrentContext 属性:这是一个只读属性。它由 .NET Framework 内部使用,以确定线程是否需要诸如同步、事务处理和安全性等的服务。
CurrentCulture 属性:你可以使用该属性获取或设置当前线程的区域性信息,而此信息为CultureInfo 类型。默认情况下,CurrentCulture 属性包括“控制面板”中区域设置选项中的所选区域。
CurrentPrincipal 属性:你可以使用此属性获取或设置运行线程所使用的主体。主体用于控制基于角色的安全性,它们包括用户名(以其名义来执行线程)和成员信息(例如,用户所属的组)。
CurrentThread 属性:这是一个只读静态属性。你可以使用此属性来了解当前正在执行的线程。例如,可以使用以下代码行来验证正在运行的线程的 CurrentCulture 属性值。System.Thread.CurrentThread.CurrentCulture
CurrentUICulture 属性: 资源管理器使用此属性在运行时查找区域性特定的资源。当应用程序使用具有不同区域性设置的本地资源文件时,此功能非常有用。例如,要自动设置资源管理器以查找用户所选区域的资源文件,请打开“控制面板”上的“设置”,然后将以下代码行添加到窗体构造函数中。Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture
ExecutionContext 属性:这是一个只读属性,它提供对线程所使用的上下文信息(例如,同步、事务处理和安全性)的访问权。
IsAlive 属性:这是一个只读 Boolean 属性。可以使用此属性来确认线程是启动了、还是尚未完成、或是终止了分配给它的任务。
IsBackground 属性:可以使用此属性来判断线程是否为后台线程,也可以使用该属性将线程设置为后台线程。后台线程是不阻止进程结束的线程,即使仍有后台线程在执行,但只要所有前台线程都结束了,就可以终止进程。
IsThreadPoolThread 属性:这是一个只读属性。可以使用此属性来判断线程是否为线程池的一部分。
ManagedThreadId 属性:这是一个只读属性。可以使用此属性来获得线程 ID。此 ID 是CLR用来识别线程的惟一的整数标识符。
Name 属性:可以使用此属性获取或设置线程的名称。它是一个string类型,只能写一次。只有在监视线程时,Name 属性才有用。
Priority 属性:可以使用此属性获取或设置线程的优先级。操作系统使用优先级来确定在给定时间内哪个线程需要处理。此属性是ThreadPriority类型,而ThreadPriority是一个枚举类型,其值如下:
Highest:具有此优先级的线程将被安排在具有任何其他优先级的线程之前。
AboveNormal:具有此优先级的线程将被安排在具有 Highest 优先级的线程之后,但在具有 Normal 优先级的线程之前。
Normal:具有此优先级的线程将被安排在具有 AboveNormal 优先级的线程之后,但在具有 BelowNormal 优先级的线程之前。线程的默认优先级为 Normal 优先级。
BelowNormal:具有此优先级的线程将被安排在具有 Normal 优先级的线程之后,但在具有 Lowest 优先级的线程之前。
Lowest:具有此优先级的线程将被安排在具有任何其他优先级的线程之后。
ThreadState 属性:这是一个只读属性。你可以使用此属性来查看线程的状态。此属性是ThreadState类型,而ThreadState是一个枚举类型,其值如下:
Aborted:线程处于 Stopped 状态中。
AbortRequested:已对线程调用了 Thread.Abort 方法,但此线程尚未收到尝试终止此线程的挂起的System.Threading.ThreadAbortException。
Background:线程正作为后台线程运行(相对于前台线程而言)。此状态可通过设置 Thread.IsBackground 属性来控制。
Running:线程已启动,它未被阻塞,且无挂起的 ThreadAbortException。
Stopped:线程已停止。
StopRequested:正在请求线程停止。仅用于内部。
Suspended:线程已挂起。
SuspendRequested:正在请求线程挂起。
Unstarted:尚未对线程调用 Thread.Start 方法。
WaitSleepJoin:由于调用 Wait、Sleep 或 Join,线程已被阻塞。
Abort 方法:你可以使用此方法引发异常和使线程停止运行。它有两个重载方法,一个无参数,而另一个有一个object类型的参数,它们用于传递有中止线程意图的异常。
BeginThreadAffinity 方法:这是一个静态方法。线程关联意味着你想将某些事物绑定到线程。如果调用 BeginThreadAffinity 方法,则任何由线程执行的代码随后都将在此线程的上下文中执行。如果宿主应用程序提供其自己的线程处理机制,而该机制允许将线程从一个进程移到另一个进程,则可能需要此方法。
EndThreadAffinity 方法:这是一个静态方法。你可以将其与 BeginThreadAffinity 结合使用,来确定在线程内根据进程标识要要执行的代码部分。
GetApartmentState 方法:可以使用此方法来获取线程的单元状态。
GetData 方法:这是一个静态方法。你可以使用它来读取指定内存槽中的数据。内存槽中的数据是通过使用 SetData 方法来创建的,这些数据仅供当前线程使用,甚至子线程也不能访问这些数据。
GetDomain 方法:这是一个静态方法。你可以使用它来检索一个AppDomain类型的对象,该对象表示线程在其中运行的应用程序域。
GetDomainId 方法:这是一个静态方法。你可以使用它来检索其中运行线程的应用程序域的域ID。
Interrupt 方法:如果线程被阻塞在 Wait、Sleep 或 Join 状态,则可以使用此方法抛出只可被代码捕捉的 ThreadInterruptedException。
Join 方法:可以使用此方法阻止线程继续执行,直到完成其他线程或超过指定时间段。
ResetAbort 方法:这是一个静态方法。你可以使用它来取消发送给当前线程的中止,还可以使用它来取消由代码(使用由用户组件创建的线程)发送的可能中止。
SetApartmentState 方法:可以使用此方法更改单元状态。
SetData 方法:可以使用此方法将数据保存到某个仅供线程访问的特殊内存槽中。
Sleep 方法:可以使用此方法使线程在指定时间内停止处理。
SpinWeight 方法:可以使用此方法使线程停止被处理指定的处理器反复次数。
Start 方法:你可以使用此方法启动线程。
TryApartmentState 方法:你可以使用此方法设置线程的 ApartmentState 属性。如果状态发生更改,则此方法将返回 true,否则,返回 false。你必须在第一次调用使用单元模型的非托管代码之前设置 ApartmentState 属性,因为调用之后再直接更改该属性将导致异常,但是,你可以改用 TryApartmentState 方法来更改线程的状态。
VolatileRead 方法:这是一个静态方法。可以使用它来读取由任何处理器写入指定字段的最新值。还可以将此方法与 VolatileWrite 结合使用,以强制执行直接内存访问,而不用经过缓存。另外,此机制还可用于实现数据同步,但使用锁定机制来实现将更为简单。
VolatileWrite 方法:这是一个静态方法。可以使用它将数据写入直接进入内存的字段中,并让所有处理器都可以使用此数据。此方法还将导致处理器缓存的刷新。另外,此机制还可用于实现数据同步,但是用锁定机制来实现数据同步会简单一些。
通过使用 ThreadPool 类管理线程池
不应该使用线程池的情况:
1.需要前台线程
2.需要某个线程具有特定的优先级
3.具有可以阻塞线程一段时间的任务
4.需要将某些线程放置在单线程的单元中
5.需要有与线程关联的稳定标识,或需要将某个线程专用于某个任务
ThreadPool 类的成员 :
BindHandle:BindHandle 方法将操作系统句柄绑定到线程池。你可以使用句柄来引用资源(例如文件)。
GetAvailableThreads:GetAvailableThreads 方法检索线程池中可用的空闲线程的数目。该值为池中最大线程数目与当前活动线程数目的差值。
GetMaxThreads:GetMaxThreads 方法检索线程池中最大线程数。如果发出的线程请求数大于最大线程数,则这些请求将在队列中等待,直到有线程可用为止。
GetMinThreads:GetMinThreads 方法检索线程池中预先为响应新请求而创建的空闲线程数。
QueueUserWorkItem:QueueUserWorkItem 方法向线程池队列添加请求。一旦池中有线程可用,线程池就立即执行该请求。它有两个重载方法,一个通过使用 ThreadStart 委托来启动线程,另一个通过使用 ParameterizedThreadStart 委托来启动线程。
RegisterWaitForSingleObject:RegisterWaitForSingleObject 方法仅当句柄获得信号时才向线程池添加启动线程的请求。在句柄获得信号之后,它将请求添加到线程池队列并在有空闲线程可用时就立即执行。它有四种重载方法,分别将超时时间指定为整数、无符号整数、long或时间间隔。作为线程起始点传递的回调方法必须接受两个参数,一个是将数据传递给线程的对象,另一个为Boolean 值(在该方法中设置它以指示该调用是否超时)。
SetMaxThreads:SetMaxThreads 方法设置线程池可容纳的线程请求数。当队列的请求数大于此数时,多余的请求仍需在队列中继续等待,直到线程池中有其它线程可用为止。
SetMinThreads:SetMinThreads 方法设置线程池中可用空闲线程数,即使预计传入的请求中没有活动的线程也一样。
管理异步环境中的线程
1.异步编程
2.使用异步类型来管理回调方法
3.通过异步调用迁移线程的执行上下文
4.使用 SynchronizationContext 来管理异步环境
使用异步类型来管理回调方法
AsyncState:可以使用 AsyncState 属性来获取一个用户定义的对象,而该对象用作 BeginInvoke 方法的最新参数。此对象被称为调用状态。
AsynWaitHandle:你可以使用 AsyncWaitHandle 属性来向 BeginInvoke 方法所创建的线程发送信号。
CompletedSynchronously CompletedSynchronously 属性是一个 Boolean 属性。你可以使用该属性来验证主线程是否执行了由 BeginInvoke 启动的调用。大多数情况下,对该属性的调用都返回一个 false。但是,.NET Framework 中的一些类使用逻辑来确定是否应同步解析异步调用,例如是否读取一个小文件。
IsCompleted:IsCompleted 属性是一个 Boolean 属性。你可以使用该属性确定一个异步调用是否完成。
通过异步调用迁移线程的执行上下文
ExecutionContext 和 HostExecutionContextManager 类 :
ExecutionContext:ExecutionContext 类可用于管理上下文从一个线程传播到另一个线程。该类可与主体结合使用,以设置线程的安全上下文并决定是否传播该上下文。当调用线程时,你可以将ExecutionContext 类和HostExecutionContext 类结合使用,以模拟CLR宿主执行上下文。你还可以将 ExecutionContext 类和HostExecutionContextManager 类结合使用以控制CLR宿主应用程序所使用的上下文。
HostExcutionContextManager:HostExecutionContext 类可用于获取正在执行的 CLR 宿主所使用的执行上下文。该类的一个重要方法是 CreateCopy 方法,当调用异步方法时,该方法用于创建一个将被使用的宿主执行上下文的副本。
HostExecutionContextManager 类可用于控制正在执行的 CLR 宿主所使用的执行上下文。
Capture Capture 方法用于获取一个表示当前线程上下文的 ExecutionContext 对象。
CreateCopy:CreateCopy 方法创建一个新的ExecutionContext 对象,其上下文与现有ExecutionContext的上下文相同。由于不同的应用程序域不能共享同一个执行上下文,所以此操作的目的是在应用程序域外创建一个新线程,让它具有相同的上下文。
IsFlowSuppressed:IsFlowSuppressed 方法是一个 Boolean 方法。你可以使用该方法确认是否已取消执行上下文的流。因为,在默认情况下,对新线程的调用都使用同一执行上下文。
RestoreFlow:RestoreFlow 方法是一个 Boolean 属性,并且可以用于确认异步调用是否完成。RestoreFlow 方法由AsyncFlowControl 结构的 Undo 方法调用,并由 SuppressFlow 方法返回。要恢复执行上下文的流,应使用 AsyncFlowControl 结构的 Undo 方法,而不是使用 RestoreFlow 方法。
Run:Run 方法可通过委托来调用某个方法,而它要使用的上下文将作为参数传给它。
SuppressFlow:SuppressFlow 方法可用于取消执行上下文从一个线程传播到另一个线程。
Capture:Capture 方法可用于获取表示 CLR 宿主上下文的 ExecutionContext 对象。
Revert:Revert 方法可用于将执行上下文恢复到先前状态。
SetHostExecutionContext:SetHostExecutionContext 方法可用于设置当前 ExecutionHostContext 的上下文。
使用 SynchronizationContext 来管理异步环境
SynchronizationContext 类的成员
Current:Current 属性返回当前线程的同步上下文。
CreateCopy:CreateCopy 方法创建当前线程的同步上下文的副本。
IsWaitNotificationRequired:IsWaitNotificationRequired 方法可用于确定是否需要等待通知。
OperationCompleted:OperationCompleted 方法可用于响应操作已完成的通知。
OperationStarted:OperationStarted 方法可用于响应操作已启动的通知。
Post:Post 方法可用于启动一个与调用方线程具有相同同步上下文的新线程。
Send:Send 方法可用于将一个方法与当前线程的同步上下文同步运行。
SetSynchronizationContext:SetSynchronizationContext 方法可用于设置当前线程的同步上下文。
Wait:Wait 方法可用于向线程发送信号,并在其他线程完成以前暂停调用方线程。
应用程序域的工作原理:
1.应用程序域
2.通过使用AppDomainSetup类来配置应用程序域
3.使用 AppDomain类来创建应用程序域
4.从应用程序域检索设置信息
5.将程序集加载到应用程序域
6.通过使用 AppDomain类来卸载应用程序域
应用程序域:
应用程序域用作隔离多个应用程序的访问边界
应用程序域由 System.AppDomain类表示,并在需要时由CLR自动创建
应用程序域和线程之间不具有一对一的相关性
通过使用AppDomainSetup类来配置应用程序域
AppDomainSetup类的成员 :
ApplicationBase:ApplicationBase属性可用于获取或设置应用程序的目录路径。
ApplicationName:ApplicationName属性可用于获取或设置应用程序名称。
ConfigurationFile:ConfigurationFile属性可用于获取或设置应用程序域的配置文件名称。
使用 AppDomain类来创建应用程序域
1.通过使用 AppDomain类可以创建应用程序域,该类的主要方法是CreateDomain方法
2.使用CreateDomain方法来创建一个基于现有AppDomainSetup对象的新应用程序域
3.创建应用程序域后,使用 AppDomain类的各个成员进行检索并应用各种设置
抛出CannotUnloadAppDomainException类型的异常原因
1.尝试卸载默认应用程序域
2.尝试卸载一个已卸载的应用程序域
3.此时有线程无法停止执行
创建多线程应用程序和应用程序域
最新推荐文章于 2020-12-01 15:49:04 发布