该如何决定何时使用托管线程池?

转载出处:http://www.tz8.net/post/74.html

 

ThreadPool 类为应用程序提供一个由系统管理的辅助线程池,从而使您可以集中精力于应用程序任务而不是线程管理。如果您具有需要后台处理的短期任务,则托管线程池是可以利用多个线程的便捷方式。

注意 :对于与用户界面交互的后台任务,.NET Framework 2.0 版还提供了 BackgroundWorker 类,该类可以使用用户界面线程中引发的事件进行通信。

.NET Framework 使用线程池线程实现多种用途,包括异步 I/O 完成、Timer 回调、注册的等待操作、使用委托的异步方法调用以及 System.Net 套接字连接。

何时不使用线程池线程
在以下几种情况下,适合于创建并管理自己的线程而不是使用线程池线程:

· 需要前台线程。

· 需要使线程具有特定的优先级。

· 您的任务会导致线程长时间被阻塞。由于线程池具有最大线程数限制,因此大量阻塞的线程池线程可能会阻止任务启动。

· 需要将线程放入单线程单元。所有 ThreadPool 线程均处于多线程单元中。

您需要具有与线程关联的稳定标识,或使某一线程专用于某一任务。

线程池特征
线程池线程是后台线程。 请参见前台和后台线程。每个线程都使用默认堆栈大小,以默认的优先级运行,并处于多线程单元中。

每个进程只有一个线程池对象。

线程池线程中的异常
线程池线程中未处理的异常将终止进程。以下为此规则的三种例外情况:

· 由于调用了 Abort ,线程池线程中将引发 ThreadAbortException

· 由于正在卸载应用程序域,线程池线程中将引发 AppDomainUnloadedException

· 公共语言运行库或宿主进程将终止线程。

有关更多信息,请参见托管线程中的异常。

注意: 在 .NET Framework 1.0 和 1.1 版中,公共语言运行库将捕获线程池线程中的未处理异常,而不出现任何提示。这可能会破坏应用程序状态,并最终导致应用程序挂起,将很难进行调试。超宝提 示:请尽可能使用.NET Framework 2.0或者更新版本。

最大线程池线程数
可排队到线程池的操作数仅受可用内存的限制;但是,线程池限制进程中可以同时处于活动状态的线程数。默认情况下,限制每个 CPU 可以使用 25 个辅助线程和 1,000 个 I/O 完成线程。

通过使用 GetMaxThreadsSetMaxThreads 方法可以控制最大线程数。

注意: 在 .NET Framework 1.0 和 1.1 版中,不能从托管代码中设置线程池大小。承载公共语言运行库的代码可以使用 mscoree.h 中定义的 CorSetMaxThreads 设置该大小。

最小空闲线程数
即使是在所有线程都处于空闲状态时,线程池也会维持最小的可用线程数,以便队列任务可以立即启动。将终止超过此最小数目的空闲线程,以节省系统资源。默认情况下,每个处理器维持一个空闲线程。

在启动新的空闲线程之前,线程池具有一个内置延迟(在 .NET Framework 2.0 版中为半秒钟)。应用程序在短期内定期启动许多任务时,空闲线程数的微小增加会导致吞吐量显著增加。将空闲线程数设置得过高会浪费系统资源。

使用 GetMinThreadsSetMinThreads 方法可以控制线程池所维持的空闲线程数。

注意: 在 .NET Framework 1.0 版中,不能设置最小空闲线程数。

跳过安全检查
线程池还提供 ThreadPool.UnsafeQueueUserWorkItem ThreadPool.UnsafeRegisterWaitForSingleObject 方法。仅当您确定调用方的堆栈与执行队列任务过程中所执行的任何安全检查都无关时,才能使用这些方法。QueueUserWorkItemRegisterWaitForSingleObject 都捕获调用方的堆栈,当线程开始执行任务时,该堆栈将合并到线程池线程的堆栈中。如果需要进行安全检查,则必须检查整个堆栈。尽管此检查提供了安全,但它还具有一定的性能开销。

使用线程池
使用线程池的方法是,从托管代码调用 ThreadPool.QueueUserWorkItem (或从非托管代码调用 CorQueueUserWorkItem )并传递表示执行任务的方法的 WaitCallback 委托。也可以通过使用 ThreadPool.RegisterWaitForSingleObject 方法并传递 WaitHandle (在向其发出信号或超时时,它将引发对由 WaitOrTimerCallback 委托表示的方法的调用)来将与等待操作相关的工作项排入队列。在这两种情况下,线程池都使用一个后台线程来调用回调方法。

 

转载出处:http://www.tz8.net/post/74.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值