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

26.Silverlight多线程技术ThreadPool的使用,第1张

概述        在实际项目的多线程 *** 作中我们用得最多的应该是ThreadPool线程池了,它可以非常方便的在线程池中使用线程来处理耗时的函数,且当函数 *** 作完成之后会释放该线程以待下一次使用,而不用像Thread线程处理那么麻烦。         在每个应用程序中只能有一个线程池,所以线程池全是静态方法而不必实例化,当然线程池里的可用线程也是有限制的(比如:当前系统支持每次处理50个任务, 我们要求

        在实际项目的多线程 *** 作中我们用得最多的应该是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
      <UserControl x: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"                 <GrID x:name="LayoutRoot" Background="White"        <sdk:Label Height="28" HorizontalAlignment="left" margin="28,84,0" name="label1" VerticalAlignment="top" WIDth="auto" />         <button Content="启动线程池" Height="23" HorizontalAlignment="left" margin="53,118,0" name="button1" VerticalAlignment="top" WIDth="75" Click="button1_Click" />         <button Content="显示空余线程" Height="23" HorizontalAlignment="left" margin="54,189,0" name="button2" VerticalAlignment="top" WIDth="75" Click="button2_Click" />         <sdk:Label Height="28" HorizontalAlignment="left" margin="28,155,0" name="label2" VerticalAlignment="top" WIDth="auto" />         </GrID>         </UserControl>       

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

总结

以上是内存溢出为你收集整理的26.Silverlight多线程技术ThreadPool的使用全部内容,希望文章能够帮你解决26.Silverlight多线程技术ThreadPool的使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1078936.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存