26.Silverlight多线程技术ThreadPool的使用

2016-08-20 10:32:43来源:http://chengxingliang.blog.51cto.com/3972944/822538作者:程兴亮人点击


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


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


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



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

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


//GetMaxThreads(outintworkerThreads,outintcompletionPortThreads)获取线程池的相关线程最大数//参数workerThreads线程池中辅助线程的最大数目//参数completionPortThreads线程池中异步I/O线程的最大数目。ThreadPool.GetMaxThreads(outmaxWorkerThread,outmaxCompletionThread);//GetMinThreads(outintworkerThreads,outintcompletionPortThreads)获取线程池的相关线程最小数//参数workerThreads线程池中辅助线程的最小数目//参数completionPortThreads线程池中异步I/O线程的最小数目。ThreadPool.GetMinThreads(outminWorkerThread,outminCompletionThread);

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



publicpartialclassMainPage:UserControl{publicMainPage(){InitializeComponent();}//第三步、通过本函数向前台显示数据publicvoidDoThing(stringarg){this.label1.Content=this.label1.Content+"-"+arg;}//声明的一个DoThing方法委托publicdelegatevoidDoThingDele(stringarg);///<summary>///显示数据,本方法用于线程池的线程调用///</summary>///<paramname="str"></param>publicvoidShowInfo(objectstr){//第二步、模拟复杂运算的时候,耗时3000毫秒Thread.Sleep(1000);//调用label1控件关联的UI线程来执行DoThingDele委托的函数,也就是跨越本线程访问UI线程以显示数据this.label1.Dispatcher.BeginInvoke(newDoThingDele(DoThing),str.ToString());}privatevoidbutton1_Click(objectsender,RoutedEventArgse){//第一步、线程池调用方法ThreadPool.QueueUserWorkItem(newWaitCallback(ShowInfo),"1");ThreadPool.QueueUserWorkItem(newWaitCallback(ShowInfo),"2");ThreadPool.QueueUserWorkItem(newWaitCallback(ShowInfo),"3");ThreadPool.QueueUserWorkItem(newWaitCallback(ShowInfo),"4");ThreadPool.QueueUserWorkItem(newWaitCallback(ShowInfo),"5");}privatevoidbutton2_Click(objectsender,RoutedEventArgse){intmaxWorkerThread,maxCompletionThread;intminWorkerThread,minCompletionThread;//GetMaxThreads(outintworkerThreads,outintcompletionPortThreads)获取线程池的相关线程最大数//参数workerThreads线程池中辅助线程的最大数目//参数completionPortThreads线程池中异步I/O线程的最大数目。ThreadPool.GetMaxThreads(outmaxWorkerThread,outmaxCompletionThread);//GetMinThreads(outintworkerThreads,outintcompletionPortThreads)获取线程池的相关线程最小数//参数workerThreads线程池中辅助线程的最小数目//参数completionPortThreads线程池中异步I/O线程的最小数目。ThreadPool.GetMinThreads(outminWorkerThread,outminCompletionThread);this.label2.Content="辅助线程的最大数目:"+maxWorkerThread+"--线程池中异步I/O线程的最大数目:"+maxCompletionThread+"--辅助线程的最小数目:"+minWorkerThread+"--线程池中异步I/O线程的最小数目:"+minCompletionThread;}}

MainPage.xaml

<UserControlx:Class="SLThreadPool.MainPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"d:DesignHeight="300"d:DesignWidth="400"xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"><Gridx:Name="LayoutRoot"Background="White"><sdk:LabelHeight="28"HorizontalAlignment="Left"Margin="28,84,0,0"Name="label1"VerticalAlignment="Top"Width="Auto"/><ButtonContent="启动线程池"Height="23"HorizontalAlignment="Left"Margin="53,118,0,0"Name="button1"VerticalAlignment="Top"Width="75"Click="button1_Click"/><ButtonContent="显示空余线程"Height="23"HorizontalAlignment="Left"Margin="54,189,0,0"Name="button2"VerticalAlignment="Top"Width="75"Click="button2_Click"/><sdk:LabelHeight="28"HorizontalAlignment="Left"Margin="28,155,0,0"Name="label2"VerticalAlignment="Top"Width="Auto"/></Grid></UserControl>


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




最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台