zoukankan      html  css  js  c++  java
  • 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
    <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,0" Name="label1" VerticalAlignment="Top" Width="Auto" />
    <Button Content="启动线程池" Height="23" HorizontalAlignment="Left" Margin="53,118,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    <Button Content="显示空余线程" Height="23" HorizontalAlignment="Left" Margin="54,189,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="button2_Click" />
    <sdk:Label Height="28" HorizontalAlignment="Left" Margin="28,155,0,0" Name="label2" VerticalAlignment="Top" Width="Auto" />
    </Grid>
    </UserControl>

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

  • 相关阅读:
    Maven---右键Servlet模板
    付宇泽 20191128-1 总结
    付宇泽20191121-1 每周例行报告
    付宇泽20191114-1 每周例行报告
    安装tensorflow时出现找不到模块问题
    罗杨美慧 20191128-1 总结
    罗杨美慧 20191121-1 每周例行报告
    罗杨美慧 20191114-1 每周例行报告
    罗杨美慧 20191107-1 每周例行报告
    罗杨美慧 20191031-1 每周例行报告
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/1985373.html
Copyright © 2011-2022 走看看