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个任务。

 


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

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


 
 
  1. //GetMaxThreads(out int workerThreads,out int completionPortThreads)获取线程池的相关线程最大数 
  2.     //参数workerThreads  线程池中辅助线程的最大数目 
  3.     //参数completionPortThreads   线程池中异步 I/O 线程的最大数目。 
  4. ThreadPool.GetMaxThreads(out maxWorkerThread,out maxCompletionThread); 
  5.  
  6. //GetMinThreads(out int workerThreads,out int completionPortThreads)获取线程池的相关线程最小数 
  7.     //参数workerThreads  线程池中辅助线程的最小数目 
  8.     //参数completionPortThreads   线程池中异步 I/O 线程的最小数目。 
  9. ThreadPool.GetMinThreads(out minWorkerThread, out minCompletionThread); 

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


  
  
  1. public partial class MainPage : UserControl 
  2. public MainPage() 
  3. InitializeComponent(); 
  4. //第三步、通过本函数向前台显示数据 
  5. public void DoThing(string arg) 
  6. this.label1.Content = this.label1.Content + "-"+arg; 
  7. //声明的一个DoThing方法委托 
  8. public delegate void DoThingDele(string arg); 
  9. /// <summary> 
  10. /// 显示数据,本方法用于线程池的线程调用 
  11. /// </summary> 
  12. /// <param name="str"></param> 
  13. public void ShowInfo(object str) 
  14. //第二步、模拟复杂运算的时候,耗时3000毫秒 
  15. Thread.Sleep(1000); 
  16. //调用label1控件关联的UI线程来执行DoThingDele委托的函数,也就是跨越本线程访问UI线程以显示数据 
  17. this.label1.Dispatcher.BeginInvoke(new DoThingDele(DoThing), str.ToString()); 
  18.  
  19. private void button1_Click(object sender, RoutedEventArgs e) 
  20. //第一步、线程池调用方法 
  21. ThreadPool.QueueUserWorkItem(new WaitCallback(ShowInfo), "1"); 
  22. ThreadPool.QueueUserWorkItem(new WaitCallback(ShowInfo), "2"); 
  23. ThreadPool.QueueUserWorkItem(new WaitCallback(ShowInfo), "3"); 
  24. ThreadPool.QueueUserWorkItem(new WaitCallback(ShowInfo), "4"); 
  25. ThreadPool.QueueUserWorkItem(new WaitCallback(ShowInfo), "5"); 
  26.  
  27. private void button2_Click(object sender, RoutedEventArgs e) 
  28.  
  29. int maxWorkerThread, maxCompletionThread; 
  30. int minWorkerThread, minCompletionThread; 
  31.  
  32. //GetMaxThreads(out int workerThreads,out int completionPortThreads)获取线程池的相关线程最大数 
  33. //参数workerThreads 线程池中辅助线程的最大数目 
  34. //参数completionPortThreads 线程池中异步 I/O 线程的最大数目。 
  35. ThreadPool.GetMaxThreads(out maxWorkerThread,out maxCompletionThread); 
  36.  
  37. //GetMinThreads(out int workerThreads,out int completionPortThreads)获取线程池的相关线程最小数 
  38. //参数workerThreads 线程池中辅助线程的最小数目 
  39. //参数completionPortThreads 线程池中异步 I/O 线程的最小数目。 
  40. ThreadPool.GetMinThreads(out minWorkerThread, out minCompletionThread); 
  41.  
  42. this.label2.Content = "辅助线程的最大数目:" + maxWorkerThread + "--线程池中异步 I/O 线程的最大数目:" + maxCompletionThread + "--辅助线程的最小数目:" + minWorkerThread + "--线程池中异步 I/O 线程的最小数目:" + minCompletionThread; 
  43.  
MainPage.xaml

   
   
  1. <UserControl x:Class="SLThreadPool.MainPage" 
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  6. mc:Ignorable="d" 
  7. d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
  8.  
  9. <Grid x:Name="LayoutRoot" Background="White"
  10. <sdk:Label Height="28" HorizontalAlignment="Left" Margin="28,84,0,0" Name="label1" VerticalAlignment="Top" Width="Auto" /> 
  11. <Button Content="启动线程池" Height="23" HorizontalAlignment="Left" Margin="53,118,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
  12. <Button Content="显示空余线程" Height="23" HorizontalAlignment="Left" Margin="54,189,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="button2_Click" /> 
  13. <sdk:Label Height="28" HorizontalAlignment="Left" Margin="28,155,0,0" Name="label2" VerticalAlignment="Top" Width="Auto" /> 
  14. </Grid> 
  15. </UserControl> 

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

 



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/822538

相关文章
|
5月前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
76 3
|
2月前
|
网络协议 安全 Java
难懂,误点!将多线程技术应用于Python的异步事件循环
难懂,误点!将多线程技术应用于Python的异步事件循环
72 0
|
3月前
|
监控 Java
线程池中线程异常后:销毁还是复用?技术深度剖析
在并发编程中,线程池作为一种高效利用系统资源的工具,被广泛用于处理大量并发任务。然而,当线程池中的线程在执行任务时遇到异常,如何妥善处理这些异常线程成为了一个值得深入探讨的话题。本文将围绕“线程池中线程异常后:销毁还是复用?”这一主题,分享一些实践经验和理论思考。
148 3
|
4月前
|
API Windows
揭秘网络通信的魔法:Win32多线程技术如何让服务器化身超级英雄,同时与成千上万客户端对话!
【8月更文挑战第16天】在网络编程中,客户/服务器模型让客户端向服务器发送请求并接收响应。Win32 API支持在Windows上构建此类应用。首先要初始化网络环境并通过`socket`函数创建套接字。服务器需绑定地址和端口,使用`bind`和`listen`函数准备接收连接。对每个客户端调用`accept`函数并在新线程中处理。客户端则通过`connect`建立连接,双方可通过`send`和`recv`交换数据。多线程提升服务器处理能力,确保高效响应。
58 6
|
4月前
三个线程交替打印ABC:技术深度解析与实战应用
【8月更文挑战第14天】在并发编程中,实现多个线程之间的精确协同工作是一项既具挑战性又极具实用价值的任务。今天,我们将深入探讨一个经典问题:如何使用三个线程交替打印字符A、B、C,且每个字符连续打印三次,之后循环进行。这个问题不仅考验了我们对线程同步机制的理解,还锻炼了我们在复杂并发场景下的设计能力。
81 0
|
5月前
|
并行计算 Java 大数据
Java中的高效并行计算与多线程编程技术
Java中的高效并行计算与多线程编程技术
|
5月前
|
Java 开发者
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
28 0
|
5月前
|
存储 算法 Java
Java面试题:详细描述Java堆内存的垃圾回收过程,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的FutureTask的工作原理
Java面试题:详细描述Java堆内存的垃圾回收过程,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的FutureTask的工作原理
34 0
|
5月前
|
安全 Java 数据挖掘
多线程编程技术探索与实践
多线程编程技术探索与实践
|
5月前
|
并行计算 Java 大数据
Java中的高效并行计算与多线程编程技术
Java中的高效并行计算与多线程编程技术