日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
探討C#多線程應(yīng)用的相關(guān)問(wèn)題

2000年6月,Microsoft發(fā)布了一種新的程序設(shè)計(jì)語(yǔ)言——C#。C#是一種現(xiàn)代的,面向?qū)ο蟮恼Z(yǔ)言,它使開發(fā)人員能夠在Microsoft .NET框架上快速建立廣泛的應(yīng)用。C#支持建立自由線程(free-threaded)的應(yīng)用,多個(gè)線程可以訪問(wèn)同一套共享數(shù)據(jù)。

我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、交口ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的交口網(wǎng)站制作公司

C#多線程應(yīng)用實(shí)例程序說(shuō)明

本文的實(shí)例程序包括一個(gè)列表框、三個(gè)按鈕。程序使用一個(gè)新的線程來(lái)運(yùn)行一個(gè)后臺(tái)處理,結(jié)果在列表框中顯示。按鈕button1啟動(dòng)一個(gè)計(jì)算平方的線程。按鈕button2停止后臺(tái)處理線程。按鈕button3退出程序。程序運(yùn)行情況如圖1所示。

C#多線程應(yīng)用 圖1

使用線程

首先創(chuàng)建運(yùn)行在新線程上的后臺(tái)任務(wù)。表1所示的代碼執(zhí)行一個(gè)相當(dāng)長(zhǎng)的運(yùn)行處理----一個(gè)無(wú)限循環(huán)。

表1、后臺(tái)處理程序

 
 
 
 
  1. private void BackgroundProcess()  
  2. {  
  3.        int i= 1;  
  4.        while(true)  
  5.        {  
  6.               //  向列表框增加一個(gè)項(xiàng)目  
  7.               listBox1.Items.Add("Iterations: " + i.ToString ());  
  8.               i ++;  
  9.               Thread.Sleep(2000);  //  指定線程休眠的時(shí)間  
  10.        }  
  11. }  

這段代碼無(wú)限循環(huán),每次執(zhí)行時(shí)在列表框中加入一個(gè)項(xiàng)目。

在規(guī)定好一個(gè)工作的處理代碼以后,就需要將這段代碼分配給一個(gè)線程,并且啟動(dòng)它。為此需要使用線程對(duì)象(Thread object),它是.NET架構(gòu)類中System.Threading命名空間的一部分。在實(shí)例化一個(gè)新的線程類時(shí),需要把在線程類構(gòu)造器中執(zhí)行的代碼塊的一個(gè)引用傳送給該實(shí)例。表2所示的代碼創(chuàng)建一個(gè)新的線程對(duì)象,并且將BackgroundProcess的一個(gè)引用傳送給該對(duì)象。

表2、線程的使用

 
 
 
 
  1. Thread t1,t2;  //  說(shuō)明為窗體類成員  
  2. t1 = new Thread(new ThreadStart(BackgroundProcess));  
  3. t1.Start();  //  以上2行放置在窗體的load事件中  

ThreadStart表示在線程上執(zhí)行的方法,這里是一個(gè)到BackgroundProcess方法的委派對(duì)象。在C#中,一個(gè)委派是一個(gè)類型安全、面向?qū)ο蟮暮瘮?shù)指針。在實(shí)例化該線程后,可以通過(guò)調(diào)用線程的Start()方法來(lái)開始執(zhí)行代碼。

控制線程

在線程啟動(dòng)以后,可以通過(guò)調(diào)用線程對(duì)象的方法來(lái)控制線程的狀態(tài)??梢酝ㄟ^(guò)調(diào)用Thread.Sleep方法來(lái)暫停一個(gè)線程的執(zhí)行,這個(gè)方法可以接收一個(gè)整型值,用來(lái)決定線程休眠的時(shí)間。對(duì)于本文的實(shí)例程序,為了讓列表項(xiàng)目增加的速度變慢,在其中放入了一個(gè)Sleep方法的調(diào)用。

可以通過(guò)調(diào)用Thread.Sleep(System.Threading.Timeout.Infinite)來(lái)讓線程進(jìn)入休眠狀態(tài),但是,這個(gè)調(diào)用的休眠時(shí)間是不確定的。要中斷這個(gè)休眠,可以調(diào)用Thread.Interrupt方法。

通過(guò)調(diào)用Thread.Suspend方法可以掛起線程。掛起可以暫停一個(gè)線程,直到另一個(gè)線程調(diào)用Thread.Resume為止。休眠和掛起的區(qū)別是,掛起并不立刻讓線程進(jìn)入一個(gè)等待的狀態(tài),線程并不會(huì)掛起,直到.NET runtime認(rèn)為現(xiàn)在已經(jīng)是一個(gè)安全的地方來(lái)掛起它了,而休眠則會(huì)立刻讓線程進(jìn)入一個(gè)等待的狀態(tài)。

表3、停止線程的執(zhí)行

 
 
 
 
  1. private void button2_Click  
  2. (object sender, System.EventArgs e)  
  3. {     t1.Abort();      }  

Thread.Abort方法可以停止一個(gè)線程的執(zhí)行。本文的實(shí)例程序通過(guò)加入一個(gè)按鈕button2來(lái)停止后臺(tái)處理,在事件處理程序中調(diào)用了Thread.Abort方法,如表3所示。

這就是多線程的強(qiáng)大之處。用戶界面的響應(yīng)很快,因?yàn)橛脩艚缑孢\(yùn)行在一個(gè)單獨(dú)的線程中,而后臺(tái)的處理運(yùn)行在另外一個(gè)線程中。在用戶按下按鈕button2時(shí),就會(huì)馬上得到響應(yīng),并且停止后臺(tái)處理。

通過(guò)多線程程序傳送數(shù)據(jù)

在實(shí)際工作中,還需要使用到多線程的許多復(fù)雜特性。其中一個(gè)問(wèn)題就是如何將程序的數(shù)據(jù)由線程類的構(gòu)造器傳入或者傳出。對(duì)于放到另外一個(gè)線程中的過(guò)程,既不能傳參數(shù)給它,也不能由它返回值,因?yàn)閭魅氲骄€程構(gòu)造器的過(guò)程是不能擁有任何參數(shù)或者返回值的。為了解決這個(gè)問(wèn)題,可以將過(guò)程封裝到一個(gè)類中,這樣,方法的參數(shù)就可使用類中的字段。

本文給出了一個(gè)簡(jiǎn)單的例子,計(jì)算一個(gè)數(shù)的平方。為了在一個(gè)新的線程中使用這個(gè)過(guò)程,將它封裝到一個(gè)類中,如表4所示。

使用表5所示的代碼在一個(gè)新的線程上啟動(dòng)CalcSquare過(guò)程。

表4、計(jì)算一個(gè)數(shù)的平方   表5、在一個(gè)新的線程上啟動(dòng)CalcSquare過(guò)程

 
 
 
 
  1. public class SquareClass  
  2. {  
  3.       public  double Value;  
  4.       public double Square;  
  5.       public void CalcSquare()  
  6.       {  
  7.              Square = Value * Value;  
  8.       }  
  9. }   private void button1_Click(object sender, System.EventArgs e)  
  10. {  
  11.       SquareClass oSquare =new SquareClass();  
  12.       t2 = new Thread(new ThreadStart(oSquare.CalcSquare));  
  13.       oSquare.Value = 30;  
  14.       t2.Start();  
  15. }  

在上述例子中,線程啟動(dòng)后,并沒(méi)有檢查類中的square值,因?yàn)榧词拐{(diào)用了線程的start方法,也不能確保其中的方法馬上執(zhí)行完。要從另一個(gè)線程中得到需要的值,有幾種方法,其中一種方法就是在線程完成的時(shí)候觸發(fā)一個(gè)事件。表6所示的代碼為SquareClass加入了事件聲明。

表6、為SquareClass加入事件聲明

 
 
 
 
  1. public delegate void EventHandler(double sq);  //  說(shuō)明委派類型  
  2. public class SquareClass  
  3. {      
  4.       public  double Value;  
  5.       public double Square;  
  6.       public event EventHandler ThreadComplete;  //  說(shuō)明事件對(duì)象  
  7.       public void CalcSquare()  
  8.       {  
  9.              Square = Value * Value;  
  10.              //  指定事件處理程序  
  11.              ThreadComplete+=new EventHandler(SquareEventHandler);  
  12.              if( ThreadComplete!=null)ThreadComplete(Square);  //  觸發(fā)事件  
  13.       }  
  14.       public static void SquareEventHandler(double  Square )  //  定義事件處理程序  
  15.       {     MessageBox.Show(Square.ToString ());      }  
  16. }  

對(duì)于這種方法,要注意的是事件處理程序SquareEventHandler運(yùn)行在產(chǎn)生該事件的線程t2中,而不是運(yùn)行在窗體執(zhí)行的線程中。

同步線程

在線程的同步方面,C#提供了幾種方法。在上述計(jì)算平方的例子中,需要與執(zhí)行計(jì)算的線程同步,以便等待它執(zhí)行完并且得到結(jié)果。另一個(gè)例子是,如果在其它線程中排序一個(gè)數(shù)組,那么在使用該數(shù)組前,必須等待該處理完成。為了實(shí)現(xiàn)同步,C#提供了lock聲明和Thread.Join方法。

lock聲明

表7、使用lock聲明

 
 
 
 
  1. public void CalcSquare1()  
  2. {  
  3.       lock( typeof(SquareClass))  
  4.       {  
  5.              Square = Value * Value;  
  6.       }  
  7. }  

lock可以得到一個(gè)對(duì)象引用的***鎖,使用時(shí)只要將該對(duì)象傳送給lock就行了。通過(guò)這個(gè)***鎖,可以確保多個(gè)線程不會(huì)訪問(wèn)共享的數(shù)據(jù)或者在多個(gè)線程上執(zhí)行的代碼。要得到一個(gè)鎖,可以使用與每個(gè)類關(guān)聯(lián)的System.Type對(duì)象。System.Type對(duì)象可以通過(guò)使用typeof運(yùn)算得到,如表7所示。

Thread.Join方法

表8、使用Thread.Join方法

 
 
 
 
  1. private void button1_Click(object sender, System.EventArgs e)  
  2. {  
  3.       SquareClass oSquare =new SquareClass();  
  4.       t2 = new Thread(new ThreadStart(oSquare.CalcSquare));  
  5.       oSquare.Value = 30;  
  6.       t2.Start();  
  7.       if( t2.Join (500) )  
  8.       {  
  9.              MessageBox.Show(oSquare.Square.ToString ());  
  10.       }  
  11. }  

Thread.Join方法可以等待一個(gè)特定的時(shí)間,直到一個(gè)線程完成。如果該線程在指定的時(shí)間內(nèi)完成了,Thread.Join將返回True,否則它返回False。在上述平方的例子中,如果不想使用觸發(fā)事件的方法,可以調(diào)用Thread.Join的方法來(lái)確定計(jì)算是否完成了。代碼如表8所示。

結(jié)論

本文通過(guò)一個(gè)實(shí)例程序說(shuō)明了C#多線程應(yīng)用和控制方法,探討了如何通過(guò)多線程程序傳送數(shù)據(jù)和線程的同步問(wèn)題。根據(jù)本文的分析可知,在C#中,使用線程是很簡(jiǎn)單的。C#支持建立自由線程的應(yīng)用,提高了資源的利用率,程序的響應(yīng)速度也得到了改善。當(dāng)然也帶來(lái)了數(shù)據(jù)傳送和線程同步等問(wèn)題。

【編輯推薦】

  1. C#實(shí)現(xiàn)多語(yǔ)言界面程序的方法介紹
  2. 介紹C#構(gòu)造函數(shù)的使用方法
  3. C#多態(tài)性的概念及其應(yīng)用
  4. 淺析C# treeview控件的使用方法
  5. 總結(jié)C#獲取當(dāng)前路徑的7種方法

網(wǎng)站欄目:探討C#多線程應(yīng)用的相關(guān)問(wèn)題
本文路徑:http://www.5511xx.com/article/cdpepoo.html