Silverlight实用窍门系列:26.Silverlight多线程技术ThreadPool的使用【附带源码实例】

简介:

 在实际项目的多线程操作中我们用得最多的应该是ThreadPool线程池了,它可以非常方便的在线程池中使用线程来处理耗时的函数,且当函数操作完成之后会释放该线程以待下一次使用,而不用像Thread线程处理那么麻烦。
        在每个应用程序中只能有一个线程池,所以线程池全是静态方法而不必实例化,当然线程池里的可用线程也是有限制的(比如:当前系统支持每次处理50个任务,我们要求它处理150个任务,那么它就会堵塞),所以系统中合理的利用线程池比一味的全用线程池更重要。
        本节将讲诉一个在Silverlight中运行ThreadPool的最简单的操作方法,其流程如下:
        第一步、ThreadPool.QueueUserWorkItem(new WaitCallback(MethodA), argA);通过调用QueueUserWorkItem方法开启一个线程处理任务MethodA,并且传递参数argA。

        第二步、在MethodA这个处理任务的方法中,我们对数据进行复杂的运算,当获取到结果的时候需要显示到前台页面。Silverlight中要显示数据到前台页面就需要调用UI线程可以采用以下方法:this.label1.Dispatcher.BeginInvoke(new DoThingDele(DoThing), str.ToString());
                    •DoThing(string str)方法是显示数据到前台的处理函数。
                    •DoThingDele是上面一个函数的委托
                    •this.label1.Dispatcher.BeginInvoke()调用label1控件关联的UI线程来执行DoThingDele委托的函数,也就是跨越本线程访问UI线程以显示数据.

        第三步、我们在DoThing(string str)函数中将结果显示处理。
        如果我们需要连续开启多个线程只需要像下面这样子多次调用QueueUserWorkItem方法即可调用线程池内的5个线程来同步处理5个任务。

ThreadPool.QueueUserWorkItem( new  WaitCallback(ShowInfo),  " 1 " );
ThreadPool.QueueUserWorkItem(
new  WaitCallback(ShowInfo),  " 2 " );
ThreadPool.QueueUserWorkItem(
new  WaitCallback(ShowInfo),  " 3 " );
ThreadPool.QueueUserWorkItem(
new  WaitCallback(ShowInfo),  " 4 " );
ThreadPool.QueueUserWorkItem(
new  WaitCallback(ShowInfo),  " 5 " );

         另外我们还可以调用以下两个函数,意义如下:

            //GetMaxThreads(out int workerThreads,out int completionPortThreads)获取线程池的相关线程最大数
                //参数workerThreads  线程池中辅助线程的最大数目
                //参数completionPortThreads   线程池中异步 I/O 线程的最大数目。 
            ThreadPool.GetMaxThreads(out maxWorkerThread,out maxCompletionThread);

            //GetMinThreads(out int workerThreads,out int completionPortThreads)获取线程池的相关线程最小数
                //参数workerThreads  线程池中辅助线程的最小数目
                //参数completionPortThreads   线程池中异步 I/O 线程的最小数目。 
            ThreadPool.GetMinThreads(out minWorkerThread, out minCompletionThread);

        下面我们看本篇实例的源代码如下:

复制代码
public   partial   class  MainPage : UserControl
{
public  MainPage()
{
InitializeComponent();
}
// 第三步、通过本函数向前台显示数据
public   void  DoThing( string  arg)
{
this .label1.Content  =   this .label1.Content  +   " - " + arg;
}
// 声明的一个DoThing方法委托
public   delegate   void  DoThingDele( string  arg);
///   <summary>
///  显示数据,本方法用于线程池的线程调用
///   </summary>
///   <param name="str"></param>
public   void  ShowInfo( object  str)
{
// 第二步、模拟复杂运算的时候,耗时3000毫秒
Thread.Sleep( 1000 );
// 调用label1控件关联的UI线程来执行DoThingDele委托的函数,也就是跨越本线程访问UI线程以显示数据
this .label1.Dispatcher.BeginInvoke( new  DoThingDele(DoThing), str.ToString());

}
private   void  button1_Click( object  sender, RoutedEventArgs e)
{
// 第一步、线程池调用方法 
ThreadPool.QueueUserWorkItem( new  WaitCallback(ShowInfo),  " 1 " );
ThreadPool.QueueUserWorkItem(
new  WaitCallback(ShowInfo),  " 2 " );
ThreadPool.QueueUserWorkItem(
new  WaitCallback(ShowInfo),  " 3 " );
ThreadPool.QueueUserWorkItem(
new  WaitCallback(ShowInfo),  " 4 " );
ThreadPool.QueueUserWorkItem(
new  WaitCallback(ShowInfo),  " 5 " );
}

private   void  button2_Click( object  sender, RoutedEventArgs e)
{

int  maxWorkerThread, maxCompletionThread;
int  minWorkerThread, minCompletionThread;

// GetMaxThreads(out int workerThreads,out int completionPortThreads)获取线程池的相关线程最大数
// 参数workerThreads 线程池中辅助线程的最大数目
// 参数completionPortThreads 线程池中异步 I/O 线程的最大数目。 
ThreadPool.GetMaxThreads( out  maxWorkerThread, out  maxCompletionThread);

// GetMinThreads(out int workerThreads,out int completionPortThreads)获取线程池的相关线程最小数
// 参数workerThreads 线程池中辅助线程的最小数目
// 参数completionPortThreads 线程池中异步 I/O 线程的最小数目。 
ThreadPool.GetMinThreads( out  minWorkerThread,  out  minCompletionThread);

this .label2.Content  =   " 辅助线程的最大数目: "   +  maxWorkerThread  +   " --线程池中异步 I/O 线程的最大数目: "   +  maxCompletionThread  +   " --辅助线程的最小数目: "   +  minWorkerThread  +   " --线程池中异步 I/O 线程的最小数目: "   + minCompletionThread;

}
}
复制代码
MainPage.xaml

        本实例采用VS2010+Silverlight 4.0编写,点击 SLThreadPool.rar 下载本实例源码,下面是点击三次“启动线程池”和一次“显示空余线程”的预览图:


本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2011/03/16/1985373.html,如需转载请自行联系原作者


相关文章
|
7月前
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
7月前
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
8月前
|
Java 中间件 调度
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
290 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
216 3
|
9月前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
436 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
1703 31
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
248 12
|
存储 运维 API
源码解密协程队列和线程队列的实现原理(一)
源码解密协程队列和线程队列的实现原理(一)
268 1
|
存储 安全 API
源码解密协程队列和线程队列的实现原理(二)
源码解密协程队列和线程队列的实现原理(二)
136 1
|
监控 Java
线程池中线程异常后:销毁还是复用?技术深度剖析
在并发编程中,线程池作为一种高效利用系统资源的工具,被广泛用于处理大量并发任务。然而,当线程池中的线程在执行任务时遇到异常,如何妥善处理这些异常线程成为了一个值得深入探讨的话题。本文将围绕“线程池中线程异常后:销毁还是复用?”这一主题,分享一些实践经验和理论思考。
386 3

热门文章

最新文章