av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

VB.NET應(yīng)用程序中多線(xiàn)程的應(yīng)用實(shí)例

很長(zhǎng)時(shí)間以來(lái),開(kāi)發(fā)人員一直要求微軟為VB增加更多的線(xiàn)程功能——這一點(diǎn)在VB.NET中終于實(shí)現(xiàn)了。VB6不支持創(chuàng)建VB.NET多線(xiàn)程的EXE、DLL以及OCX。但這種措詞容易引起誤解,這是因?yàn)閂B6支持執(zhí)行多個(gè)單線(xiàn)程的單元。一個(gè)單元實(shí)際上是代碼執(zhí)行的場(chǎng)所而且單元的邊界限制了外部代碼對(duì)單元內(nèi)部的訪(fǎng)問(wèn)。

創(chuàng)新互聯(lián)專(zhuān)注于常寧企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,電子商務(wù)商城網(wǎng)站建設(shè)。常寧網(wǎng)站建設(shè)公司,為常寧等地區(qū)提供建站服務(wù)。全流程定制設(shè)計(jì),專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)

VB.NET支持創(chuàng)建自由線(xiàn)程的應(yīng)用程序。這意味著多個(gè)線(xiàn)程可以訪(fǎng)問(wèn)同一個(gè)共享的數(shù)據(jù)集。本文將帶領(lǐng)你了解VB.NET多線(xiàn)程的基本內(nèi)容。

雖然VB支持多個(gè)單線(xiàn)程的單元,但并不支持允許多個(gè)線(xiàn)程在同一個(gè)數(shù)據(jù)集上運(yùn)行的自由線(xiàn)程模型。在很多情況下,產(chǎn)生一個(gè)運(yùn)行后臺(tái)處理程序的新線(xiàn)程會(huì)提高應(yīng)用程序的可用性。一種很顯然的情況就是當(dāng)執(zhí)行一個(gè)可能使窗體看起來(lái)停止響應(yīng)的長(zhǎng)過(guò)程時(shí),你一定會(huì)想在窗體上放置一個(gè)取消按鈕。

解決方法

由于VB.NET使用公共語(yǔ)言運(yùn)行時(shí)(Common Language Runtime),它增強(qiáng)了很多新的特性,其中之一便是創(chuàng)建自由線(xiàn)程應(yīng)用程序的能力。

在VB.NET中,開(kāi)始使利用線(xiàn)程進(jìn)行工作是很容易的。稍后我們會(huì)探究一些精妙之處,我們先創(chuàng)建一個(gè)簡(jiǎn)單的窗體,它生成一個(gè)執(zhí)行后臺(tái)處理程序的新線(xiàn)程。我們需要做的第一件事是將要在新線(xiàn)程上運(yùn)行的后臺(tái)處理程序。下面的代碼執(zhí)行一個(gè)相當(dāng)長(zhǎng)的運(yùn)行過(guò)程——一個(gè)無(wú)限循環(huán):

 
 
 
  1. Private Sub BackgroundProcess()  
  2.  
  3.     Dim i As Integer = 1 
  4.  
  5.     Do While True  
  6.  
  7.         ListBox1.Items.Add("Iterations: " + i)  
  8.  
  9.         i += 1  
  10.  
  11.     Loop  
  12.  
  13. End Sub  

這段代碼無(wú)限地循環(huán)并在每次循環(huán)中向窗體上的列表框中增加一個(gè)條目。如果你對(duì)VB.NET不熟悉的話(huà),便會(huì)發(fā)現(xiàn)這段代碼中有一些在VB6中無(wú)法完成的事:

◆在聲明變量時(shí)對(duì)其賦值 Dim i As Integer=1

◆使用+=操作符 i+=1代替了i=i+1

◆Call關(guān)鍵字已經(jīng)被去除了

一旦我們有了一個(gè)工作過(guò)程,便需要將這段代碼指派給一個(gè)新的線(xiàn)程并開(kāi)始它的執(zhí)行。完成這項(xiàng)工作,我們需要使用Thread對(duì)象,它是.NET框架類(lèi)中System.Threading命名空間的一部分。當(dāng)實(shí)例化了一個(gè)新的Thread類(lèi)時(shí),我們向其傳遞一個(gè)引用,這個(gè)引用指向我們想要在Thread類(lèi)的構(gòu)造函數(shù)中執(zhí)行的代碼塊。下面的代碼創(chuàng)建一個(gè)新的Thread對(duì)象并將指向BackgroundProcess的引用傳遞給它:

 
 
 
  1. Dim t As Thread  
  2.  
  3. t = New Thread(AddressOf Me.BackgroundProcess)  
  4.  
  5. t.Start()  

AddressOf操作符為BackgroundProcess方法創(chuàng)建了一個(gè)委派對(duì)象。委派在VB.NET中是一種類(lèi)型安全的、面向?qū)ο蟮暮瘮?shù)指針。在線(xiàn)程被實(shí)例化之后,你可以通過(guò)調(diào)用線(xiàn)程的Start()方法開(kāi)始執(zhí)行代碼。

使線(xiàn)程處于控制之下

當(dāng)線(xiàn)程開(kāi)始之后,你可以通過(guò)使用Thread對(duì)象的方法對(duì)其狀態(tài)進(jìn)行一定的控制。你可以通過(guò)調(diào)用Thread.Sleep方法暫停線(xiàn)程的執(zhí)行。這個(gè)方法接收一個(gè)表示線(xiàn)程將要休眠多長(zhǎng)時(shí)間的整型數(shù)值。如果在上例中你想要減緩列表框條目的添加,在代碼中放置一個(gè)對(duì)此方法的調(diào)用:

 
 
 
  1. Private Sub BackgroundProcess()  
  2.  
  3.     Dim i As Integer = 1 
  4.  
  5.     Do While True  
  6.  
  7.         ListBox1.Items.Add("Iterations: " + i)  
  8.  
  9.         i += 1  
  10.  
  11.         Thread.CurrentThread.Sleep(2000)  
  12.  
  13.     Loop  
  14.  
  15. End Sub  

CurrentThread是一個(gè)公共靜態(tài)屬性,它可以使你獲取一個(gè)對(duì)當(dāng)前運(yùn)行線(xiàn)程的引用。

你還可以通過(guò)調(diào)用Thread.Sleep (System.Threading.Timeout.Infinite)使一個(gè)線(xiàn)程處于一種時(shí)間不確定的休眠狀態(tài)。要中斷這種休眠,可以調(diào)用Thread.Interrupt 方法。

類(lèi)似與Sleep和Interrupt的是Suspend和Resume。Suspend允許你阻塞一個(gè)線(xiàn)程直到另外的線(xiàn)程調(diào)用Thread.Resume。Sleep和Suspend之間的區(qū)別在于后者不是立即使一個(gè)線(xiàn)程處于等待狀態(tài)。在.NET運(yùn)行時(shí)確定線(xiàn)程是處于一個(gè)安全的掛起位置之前,線(xiàn)程是不會(huì)掛起的。Sleep則是立即使線(xiàn)程進(jìn)入等待狀態(tài)。

最后,Thread.Abort中止一個(gè)線(xiàn)程的執(zhí)行。在我們的簡(jiǎn)單例子中,我們還想增加另外一個(gè)可以使我們中止程序的按鈕。要完成這些,我們所需做的一切便是如下面這樣調(diào)用Thread.Abort方法:

 
 
 
  1. Private Sub Button2_Click(ByVal sender As System.Object, _  
  2.  
  3.         ByVal e As System.EventArgs) Handles Button2.Click  
  4.  
  5.     t.Abort()  
  6.  
  7. End Sub  

在此便可以看出多線(xiàn)程的能力。用戶(hù)界面看起來(lái)對(duì)用戶(hù)是有響應(yīng)的,因?yàn)樗\(yùn)行在一個(gè)線(xiàn)程中而后臺(tái)的處理程序運(yùn)行在另一個(gè)線(xiàn)程中。取消按鈕會(huì)立即響應(yīng)用戶(hù)的click事件同時(shí)處理過(guò)程被中止。

通過(guò)VB.NET多線(xiàn)程的過(guò)程傳遞數(shù)據(jù)

上一個(gè)例子展示了一種相當(dāng)簡(jiǎn)單的情況。在你編程的時(shí)候,多線(xiàn)程有很多需要解決的復(fù)雜問(wèn)題。你將會(huì)遇到的一個(gè)問(wèn)題是向傳遞給Thread類(lèi)構(gòu)造函數(shù)的過(guò)程傳遞數(shù)據(jù)以及從這個(gè)過(guò)程傳出數(shù)據(jù)。換言之,你想要在另一個(gè)線(xiàn)程上開(kāi)始的過(guò)程不能接收任何參數(shù)而且你也不能從這個(gè)過(guò)程返回任何數(shù)據(jù)。這是因?yàn)閭鬟f給線(xiàn)程構(gòu)造函數(shù)的過(guò)程不能有任何參數(shù)或返回值。為了避開(kāi)這個(gè)問(wèn)題,將你的過(guò)程包裝到一個(gè)類(lèi)中,在這個(gè)類(lèi)中此方法的參數(shù)被表示成類(lèi)的一個(gè)域。

有一個(gè)簡(jiǎn)單的例子,如果我們有一個(gè)計(jì)算一個(gè)數(shù)的平方的過(guò)程:

 
 
 
  1. Function Square(ByVal Value As Double) As Double  
  2.  
  3.     Return Value * Value  
  4.  
  5. End Function  

為了使這個(gè)過(guò)程可以在一個(gè)新線(xiàn)程中使用,我們將其包裝到一個(gè)類(lèi)中:

 
 
 
  1. Public Class SquareClass  
  2.  
  3.     Public Value As Double  
  4.  
  5.     Public Square As Double  
  6.  
  7.     Public Sub CalcSquare()  
  8.  
  9.         Square = Value * Value  
  10.  
  11.     End Sub  
  12.  
  13. End Class  

使用這些代碼在一個(gè)新線(xiàn)程中啟動(dòng)CalcSquare過(guò)程,代碼如下:

 
 
 
  1. Private Sub Button1_Click(ByVal sender As System.Object, _  
  2.  
  3.         ByVal e As System.EventArgs) Handles Button1.Click  
  4.  
  5.     Dim oSquare As New SquareClass()  
  6.  
  7.     t = New Thread(AddressOf oSquare.CalcSquare)  
  8.  
  9.     oSquare.Value = 30 
  10.  
  11.     t.Start()  
  12.  
  13. End Sub  

注意:當(dāng)線(xiàn)程開(kāi)始后,我們沒(méi)有檢查類(lèi)的平方值,因?yàn)椴⒉荒鼙WC一旦你調(diào)用線(xiàn)程Start方法,它便會(huì)執(zhí)行。有一些方法可以從另外的線(xiàn)程中獲取這個(gè)值。最簡(jiǎn)單的方法是當(dāng)線(xiàn)程完成時(shí)引發(fā)一個(gè)事件。我們會(huì)在下一個(gè)部分線(xiàn)程同步中討論另外一種方法。下面的代碼為SquareClass增加了事件聲明。

 
 
 
  1. Public Class SquareClass  
  2.  
  3.     Public Value As Double  
  4.  
  5.     Public Square As Double  
  6.  
  7.     Public Event ThreadComplete(ByVal Square As Double)  
  8.  
  9.     Public Sub CalcSquare()  
  10.  
  11.         Square = Value * Value  
  12.  
  13.         RaiseEvent ThreadComplete(Square)  
  14.  
  15.     End Sub  
  16.  
  17. End Class  

在調(diào)用代碼中捕獲這個(gè)事件與VB6相比沒(méi)有太大的變化,仍然是用WithEvents聲明變量并在一個(gè)過(guò)程中處理事件。變化的部分是用Handles關(guān)鍵字聲明處理事件的過(guò)程并且不再使用像VB6中Object_Event的命名約定。

 
 
 
  1. Dim WithEvents oSquare As SquareClass  
  2.  
  3. Private Sub Button1_Click(ByVal sender As System.Object, _  
  4.  
  5.         ByVal e As System.EventArgs) Handles Button1.Click  
  6.  
  7.     oSquare = New SquareClass()  
  8.  
  9.     t = New Thread(AddressOf oSquare.CalcSquare)  
  10.  
  11.     oSquare.Value = 30 
  12.  
  13.     t.Start()  
  14.  
  15. End Sub  
  16.  
  17. Sub SquareEventHandler(ByVal Square As Double) _  
  18.  
  19.         Handles oSquare.ThreadComplete  
  20.  
  21.     MsgBox("The square is " & Square)  
  22.  
  23. End Sub  

這個(gè)方法需要注意的一個(gè)問(wèn)題是處理事件的過(guò)程,在本例中是SquareEventHandler,將運(yùn)行在引發(fā)事件的線(xiàn)程中,而不是運(yùn)行在窗體從中執(zhí)行的線(xiàn)程中。

線(xiàn)程同步

VB.NET包含了一些語(yǔ)句用于提供線(xiàn)程的同步。在Square的例子中,你可能想同步執(zhí)行計(jì)算的線(xiàn)程以便等到計(jì)算完成,這樣便可以獲得結(jié)果。舉另外一個(gè)例子,如果你在一個(gè)單獨(dú)的線(xiàn)程中對(duì)數(shù)組進(jìn)行排序并且在使用這個(gè)數(shù)組之前要等待這個(gè)處理過(guò)程結(jié)束。為了實(shí)現(xiàn)這些同步,VB.NET提供了SyncLock語(yǔ)句和Thread.Join方法。

SyncLock獲取了對(duì)傳遞給它的對(duì)象引用的獨(dú)占性鎖。通過(guò)取得這種獨(dú)占鎖,你可以確保多個(gè)線(xiàn)程不會(huì)訪(fǎng)問(wèn)共享的數(shù)據(jù)或是在多個(gè)線(xiàn)程上執(zhí)行代碼。一個(gè)可以方便地用于獲取鎖地對(duì)象是關(guān)聯(lián)于每個(gè)類(lèi)的System.Type對(duì)象。可以通過(guò)GetType方法獲得System.Type對(duì)象:

 
 
 
  1. Public Sub CalcSquare()  
  2.  
  3.     SyncLock GetType(SquareClass)  
  4.  
  5.         Square = Value * Value  
  6.  
  7.     End SyncLock  
  8.  
  9. End Sub  

最后,Thread.Join方法允許你等待一段特定的時(shí)間直到一個(gè)線(xiàn)程結(jié)束。如果線(xiàn)程在你所確定的時(shí)間之前完成,Thread.Join返回True,否則的話(huà)返回False。在Square的例子中,如果我們不想引發(fā)事件,可以調(diào)用Thread.Join方法來(lái)確定計(jì)算是否已經(jīng)結(jié)束。代碼如下所示:

 
 
 
  1. Private Sub Button1_Click(ByVal sender As System.Object, _  
  2.  
  3.         ByVal e As System.EventArgs) Handles Button1.Click  
  4.  
  5.     Dim oSquare As New SquareClass()  
  6.  
  7.     t = New Thread(AddressOf oSquare.CalcSquare)  
  8.  
  9.     oSquare.Value = 30 
  10.  
  11.     t.Start()  
  12.  
  13.     If t.Join(500) Then  
  14.  
  15.         MsgBox(oSquare.Square)  
  16.  
  17.     End If  
  18.  
  19. End Sub  

【編輯推薦】

  1. 解析VB.NET如何連接數(shù)據(jù)庫(kù)
  2. 談?wù)刅B.NET數(shù)組的使用
  3. 淺談VB.NET中的跨進(jìn)程消息鉤子
  4. 十分鐘教你如何使用VB程序
  5. VB.NET語(yǔ)法快速入門(mén)

網(wǎng)站標(biāo)題:VB.NET應(yīng)用程序中多線(xiàn)程的應(yīng)用實(shí)例
文章來(lái)源:http://uogjgqi.cn/article/cdjjegd.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流