日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/4/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?下載本實例源碼,下面是點擊三次“啟動線程池”和一次“顯示空余線程”的預覽圖:

    ?



    本文轉自程興亮 51CTO博客,原文鏈接:http://blog.51cto.com/chengxingliang/822538

    總結

    以上是生活随笔為你收集整理的26.Silverlight多线程技术ThreadPool的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。