silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了26.Silverlight多线程技术ThreadPool的使用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

        在实际项目的多线程操作中我们用得最多的应该是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个任务。

 

 
 
  1. @H_450_36@@H_450_36@ThreadPool.QueueUserWorkItem(new WaitCallBACk(ShowInfo), "1"@H_450_36@); 
  2. @H_450_36@ThreadPool.QueueUserWorkItem(new WaitCallBACk(ShowInfo), "2"@H_450_36@); 
  3. @H_450_36@ThreadPool.QueueUserWorkItem(new WaitCallBACk(ShowInfo), "3"@H_450_36@); 
  4. @H_450_36@ThreadPool.QueueUserWorkItem(new WaitCallBACk(ShowInfo), "4"@H_450_36@); 
  5. @H_450_36@ThreadPool.QueueUserWorkItem(new WaitCallBACk(ShowInfo), "5"@H_450_36@); 

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

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

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

  
  
  1. @H_450_36@public@H_450_36@ partial@H_450_36@ class MainPage : UserControl 
  2. @H_450_36@{ 
  3. @H_450_36@public@H_450_36@ MainPage() 
  4. @H_450_36@{ 
  5. @H_450_36@InitializeComponent(); 
  6. @H_450_36@} 
  7. @H_450_36@//第三步、通过本函数前台显示数据 
  8. @H_450_36@public@H_450_36@ void DoThing(String arg) 
  9. @H_450_36@{ 
  10. @H_450_36@this.label1.Content = this.label1.Content + "-"@H_450_36@+arg; 
  11. @H_450_36@} 
  12. @H_450_36@//声明的一个DoThing方法委托 
  13. @H_450_36@public@H_450_36@ delegate void DoThingDele(String arg); 
  14. @H_450_36@/// <sumMary
  15. @H_450_36@/// 显示数据,本方法用于线程池的线程调用 
  16. @H_450_36@/// </sumMary
  17. @H_450_36@/// <param name@H_450_36@="str"@H_450_36@></param> 
  18. @H_450_36@public@H_450_36@ void ShowInfo(object str) 
  19. @H_450_36@{ 
  20. @H_450_36@//第二步、模拟复杂运算的时候,耗时3000毫秒 
  21. @H_450_36@Thread.Sleep(1000); 
  22. @H_450_36@//调用label1控件关联的UI线程来执行DoThingDele委托的函数,也就是跨越本线程访问UI线程以显示数据 
  23. @H_450_36@this.label1.Dispatcher.beginInvoke(new DoThingDele(DoThing), str.ToString()); 
  24. @H_450_36@ 
  25. @H_450_36@} 
  26. @H_450_36@private void button1_Click(object sender, routedEventArgs E) 
  27. @H_450_36@{ 
  28. @H_450_36@//第一步、线程池调用方法 
  29. @H_450_36@ThreadPool.QueueUserWorkItem(new WaitCallBACk(ShowInfo), "1"@H_450_36@); 
  30. @H_450_36@ThreadPool.QueueUserWorkItem(new WaitCallBACk(ShowInfo), "2"@H_450_36@); 
  31. @H_450_36@ThreadPool.QueueUserWorkItem(new WaitCallBACk(ShowInfo), "3"@H_450_36@); 
  32. @H_450_36@ThreadPool.QueueUserWorkItem(new WaitCallBACk(ShowInfo), "4"@H_450_36@); 
  33. @H_450_36@ThreadPool.QueueUserWorkItem(new WaitCallBACk(ShowInfo), "5"@H_450_36@); 
  34. @H_450_36@} 
  35. @H_450_36@ 
  36. @H_450_36@private void button2_Click(object sender, routedEventArgs E) 
  37. @H_450_36@{ 
  38. @H_450_36@ 
  39. @H_450_36@int@H_450_36@ maxWorkerThread, maxCompletionThread; 
  40. @H_450_36@int@H_450_36@ minWorkerThread, minCompletionThread; 
  41. @H_450_36@ 
  42. @H_450_36@//GetMaxThreads(out@H_450_36@ int@H_450_36@ workerThreads,out@H_450_36@ int@H_450_36@ completionPortThreads)获取线程池的相关线程最大数 
  43. @H_450_36@//参数workerThreads 线程池中辅助线程的最大数目 
  44. @H_450_36@//参数completionPortThreads 线程池中异步 I/O 线程的最大数目。 
  45. @H_450_36@ThreadPool.GetMaxThreads(out@H_450_36@ maxWorkerThread,out@H_450_36@ maxCompletionThread); 
  46. @H_450_36@ 
  47. @H_450_36@//GetMinThreads(out@H_450_36@ int@H_450_36@ workerThreads,out@H_450_36@ int@H_450_36@ completionPortThreads)获取线程池的相关线程最小数 
  48. @H_450_36@//参数workerThreads 线程池中辅助线程的最小数目 
  49. @H_450_36@//参数completionPortThreads 线程池中异步 I/O 线程的最小数目。 
  50. @H_450_36@ThreadPool.GetMinThreads(out@H_450_36@ minWorkerThread, out@H_450_36@ minCompletionThread); 
  51. @H_450_36@ 
  52. @H_450_36@this.label2.Content = "辅助线程的最大数目:"@H_450_36@ + maxWorkerThread + "--线程池中异步 I/O 线程的最大数目:"@H_450_36@ + maxCompletionThread + "--辅助线程的最小数目:"@H_450_36@ + minWorkerThread + "--线程池中异步 I/O 线程的最小数目:"@H_450_36@ + minCompletionThread; 
  53. @H_450_36@ 
  54. @H_450_36@} 
  55. @H_450_36@} 
@H_114_528@mainPage.xaml
   
   
  1. @H_450_36@@H_450_36@<UserControl x:Class="SLThreadPool.MainPage"@H_450_36@ 
  2. @H_450_36@xmlns="http://scheR_370_11845@as.microsoft.com/winfx/2006/xaml/presentation"@H_450_36@ 
  3. @H_450_36@xmlns:x="http://scheR_370_11845@as.microsoft.com/winfx/2006/xaml"@H_450_36@ 
  4. @H_450_36@xmlns:d="http://scheR_370_11845@as.microsoft.com/expression/blend/2008"@H_450_36@ 
  5. @H_450_36@xmlns:mc="http://scheR_370_11845@as.openxmlformats.org/markup-compatibility/2006"@H_450_36@ 
  6. @H_450_36@mc:Ignorable="d"@H_450_36@ 
  7. @H_450_36@d:DesignHeight="300"@H_450_36@ d:DesignWidth="400"@H_450_36@ xmlns:sdk="http://scheR_370_11845@as.microsoft.com/winfx/2006/xaml/presentation/sdk"@H_450_36@> 
  8. @H_450_36@ 
  9. @H_450_36@<Grid x:Name@H_450_36@="LayoutRoot"@H_450_36@ BACkground="White"@H_450_36@> 
  10. @H_450_36@<sdk:Label Height="28"@H_450_36@ HorizontalAlignment="Left"@H_450_36@ Margin="28,84,0"@H_450_36@ Name@H_450_36@="label1"@H_450_36@ VerticalAlignment="Top"@H_450_36@ Width="Auto"@H_450_36@ /> 
  11. @H_450_36@<Button Content="启动线程池"@H_450_36@ Height="23"@H_450_36@ HorizontalAlignment="Left"@H_450_36@ Margin="53,118,0"@H_450_36@ Name@H_450_36@="button1"@H_450_36@ VerticalAlignment="Top"@H_450_36@ Width="75"@H_450_36@ Click="button1_Click"@H_450_36@ /> 
  12. @H_450_36@<Button Content="显示空余线程"@H_450_36@ Height="23"@H_450_36@ HorizontalAlignment="Left"@H_450_36@ Margin="54,189,0"@H_450_36@ Name@H_450_36@="button2"@H_450_36@ VerticalAlignment="Top"@H_450_36@ Width="75"@H_450_36@ Click="button2_Click"@H_450_36@ /> 
  13. @H_450_36@<sdk:Label Height="28"@H_450_36@ HorizontalAlignment="Left"@H_450_36@ Margin="28,155,0"@H_450_36@ Name@H_450_36@="label2"@H_450_36@ VerticalAlignment="Top"@H_450_36@ Width="Auto"@H_450_36@ /> 
  14. @H_450_36@</Grid> 
  15. @H_450_36@</UserControl> 

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

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

大佬总结

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。