生活随笔
收集整理的這篇文章主要介紹了
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的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。