更新时间:2022-08-26 21:49:37
在实际项目的多线程操作中我们用得最多的应该是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个任务。
另外我们还可以调用以下两个函数,意义如下:
//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);
下面我们看本篇实例的源代码如下:
本实例采用VS2010+Silverlight 4.0编写,点击 SLThreadPool.rar 下载本实例源码,下面是点击三次“启动线程池”和一次“显示空余线程”的预览图:
本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2011/03/16/1985373.html,如需转载请自行联系原作者
Silverlight实用窍门系列:21.循环访问WebService方法来看Silverlight下WebService异步请求【附带源码实例】
Silverlight实用窍门系列:54.详解Silverlight中的矩阵变换MatrixTransform,实现其余各种变换【附带实例源码】
Silverlight实用窍门系列:27.Silverlight二维旋转+平面渐变+动画,模拟雷达扫描图之基本框架【附带源码实例】
Silverlight实用窍门系列:23.Silverlight多线程技术Thread的应用,后台线程更新UI控件,向多线程传递参数【附带源码实例】
Silverlight实用窍门系列:32.WebClient上传String、下载String、上传Stream流、下载Stream流【附带源码实例】
Silverlight实用窍门系列:29.Silverlight碰撞测试、检测自定义控件碰撞,雷达扫描图之扫描雷达点状态【附带源码实例】
Silverlight实用窍门系列:28.Silverlight制作随机分布雷达扫描点,模拟雷达扫描图之被扫描设备【附带源码实例】