国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

VB.NET應用程序中多線程的應用實例

開發 后端
VB.NET支持創建自由線程的應用程序。這意味著多個線程可以訪問同一個共享的數據集。本文將帶領你了解VB.NET多線程的基本內容。

很長時間以來,開發人員一直要求微軟為VB增加更多的線程功能——這一點在VB.NET中終于實現了。VB6不支持創建VB.NET多線程的EXE、DLL以及OCX。但這種措詞容易引起誤解,這是因為VB6支持執行多個單線程的單元。一個單元實際上是代碼執行的場所而且單元的邊界限制了外部代碼對單元內部的訪問。

VB.NET支持創建自由線程的應用程序。這意味著多個線程可以訪問同一個共享的數據集。本文將帶領你了解VB.NET多線程的基本內容。

雖然VB支持多個單線程的單元,但并不支持允許多個線程在同一個數據集上運行的自由線程模型。在很多情況下,產生一個運行后臺處理程序的新線程會提高應用程序的可用性。一種很顯然的情況就是當執行一個可能使窗體看起來停止響應的長過程時,你一定會想在窗體上放置一個取消按鈕。

解決方法

由于VB.NET使用公共語言運行時(Common Language Runtime),它增強了很多新的特性,其中之一便是創建自由線程應用程序的能力。

在VB.NET中,開始使利用線程進行工作是很容易的。稍后我們會探究一些精妙之處,我們先創建一個簡單的窗體,它生成一個執行后臺處理程序的新線程。我們需要做的第一件事是將要在新線程上運行的后臺處理程序。下面的代碼執行一個相當長的運行過程——一個無限循環:

  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  

這段代碼無限地循環并在每次循環中向窗體上的列表框中增加一個條目。如果你對VB.NET不熟悉的話,便會發現這段代碼中有一些在VB6中無法完成的事:

◆在聲明變量時對其賦值 Dim i As Integer=1

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

◆Call關鍵字已經被去除了

一旦我們有了一個工作過程,便需要將這段代碼指派給一個新的線程并開始它的執行。完成這項工作,我們需要使用Thread對象,它是.NET框架類中System.Threading命名空間的一部分。當實例化了一個新的Thread類時,我們向其傳遞一個引用,這個引用指向我們想要在Thread類的構造函數中執行的代碼塊。下面的代碼創建一個新的Thread對象并將指向BackgroundProcess的引用傳遞給它:

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

AddressOf操作符為BackgroundProcess方法創建了一個委派對象。委派在VB.NET中是一種類型安全的、面向對象的函數指針。在線程被實例化之后,你可以通過調用線程的Start()方法開始執行代碼。

使線程處于控制之下

當線程開始之后,你可以通過使用Thread對象的方法對其狀態進行一定的控制。你可以通過調用Thread.Sleep方法暫停線程的執行。這個方法接收一個表示線程將要休眠多長時間的整型數值。如果在上例中你想要減緩列表框條目的添加,在代碼中放置一個對此方法的調用:

  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是一個公共靜態屬性,它可以使你獲取一個對當前運行線程的引用。

你還可以通過調用Thread.Sleep (System.Threading.Timeout.Infinite)使一個線程處于一種時間不確定的休眠狀態。要中斷這種休眠,可以調用Thread.Interrupt 方法。

類似與Sleep和Interrupt的是Suspend和Resume。Suspend允許你阻塞一個線程直到另外的線程調用Thread.Resume。Sleep和Suspend之間的區別在于后者不是立即使一個線程處于等待狀態。在.NET運行時確定線程是處于一個安全的掛起位置之前,線程是不會掛起的。Sleep則是立即使線程進入等待狀態。

最后,Thread.Abort中止一個線程的執行。在我們的簡單例子中,我們還想增加另外一個可以使我們中止程序的按鈕。要完成這些,我們所需做的一切便是如下面這樣調用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  

在此便可以看出多線程的能力。用戶界面看起來對用戶是有響應的,因為它運行在一個線程中而后臺的處理程序運行在另一個線程中。取消按鈕會立即響應用戶的click事件同時處理過程被中止。

通過VB.NET多線程的過程傳遞數據

上一個例子展示了一種相當簡單的情況。在你編程的時候,多線程有很多需要解決的復雜問題。你將會遇到的一個問題是向傳遞給Thread類構造函數的過程傳遞數據以及從這個過程傳出數據。換言之,你想要在另一個線程上開始的過程不能接收任何參數而且你也不能從這個過程返回任何數據。這是因為傳遞給線程構造函數的過程不能有任何參數或返回值。為了避開這個問題,將你的過程包裝到一個類中,在這個類中此方法的參數被表示成類的一個域。

有一個簡單的例子,如果我們有一個計算一個數的平方的過程:

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

為了使這個過程可以在一個新線程中使用,我們將其包裝到一個類中:

  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  

使用這些代碼在一個新線程中啟動CalcSquare過程,代碼如下:

  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  

注意:當線程開始后,我們沒有檢查類的平方值,因為并不能保證一旦你調用線程Start方法,它便會執行。有一些方法可以從另外的線程中獲取這個值。最簡單的方法是當線程完成時引發一個事件。我們會在下一個部分線程同步中討論另外一種方法。下面的代碼為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  

在調用代碼中捕獲這個事件與VB6相比沒有太大的變化,仍然是用WithEvents聲明變量并在一個過程中處理事件。變化的部分是用Handles關鍵字聲明處理事件的過程并且不再使用像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  

這個方法需要注意的一個問題是處理事件的過程,在本例中是SquareEventHandler,將運行在引發事件的線程中,而不是運行在窗體從中執行的線程中。

線程同步

VB.NET包含了一些語句用于提供線程的同步。在Square的例子中,你可能想同步執行計算的線程以便等到計算完成,這樣便可以獲得結果。舉另外一個例子,如果你在一個單獨的線程中對數組進行排序并且在使用這個數組之前要等待這個處理過程結束。為了實現這些同步,VB.NET提供了SyncLock語句和Thread.Join方法。

SyncLock獲取了對傳遞給它的對象引用的獨占性鎖。通過取得這種獨占鎖,你可以確保多個線程不會訪問共享的數據或是在多個線程上執行代碼。一個可以方便地用于獲取鎖地對象是關聯于每個類的System.Type對象。可以通過GetType方法獲得System.Type對象:

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

最后,Thread.Join方法允許你等待一段特定的時間直到一個線程結束。如果線程在你所確定的時間之前完成,Thread.Join返回True,否則的話返回False。在Square的例子中,如果我們不想引發事件,可以調用Thread.Join方法來確定計算是否已經結束。代碼如下所示:

  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如何連接數據庫
  2. 談談VB.NET數組的使用
  3. 淺談VB.NET中的跨進程消息鉤子
  4. 十分鐘教你如何使用VB程序
  5. VB.NET語法快速入門
責任編輯:仲衡 來源: bianceng
相關推薦

2009-10-27 12:20:06

VB.NET多線程應用

2010-01-13 14:26:39

VB.NET開發

2009-10-21 09:24:31

VB.NET應用程序

2009-04-30 13:24:45

VB.NET 2008窗體應用實例

2010-01-12 16:20:44

VB.NET類

2009-10-09 15:59:41

VB.NET對象

2009-10-23 09:26:09

VB.NET多線程

2010-01-18 18:06:07

VB.NET多線程

2010-02-06 09:01:58

ViewState

2009-10-26 10:44:27

VB.NET API函

2010-01-07 15:57:02

VB.NET ForEach

2009-10-21 09:40:23

VB.NET搜索

2010-07-06 15:54:30

VB.NET UDP

2009-11-02 15:57:36

VB.NET WEB

2010-01-07 15:25:11

VB.NET數組

2009-11-10 16:46:52

VB.NET指針應用

2009-10-10 16:15:49

VB.NET開發多線程

2009-10-20 10:59:32

VB.NET編程

2010-01-08 10:48:05

VB.NET多線程

2010-01-08 18:02:33

VB.NET事件
點贊
收藏

51CTO技術棧公眾號

思热99re视热频这里只精品| 日韩欧美国产麻豆| 亚洲午夜国产成人| 亚洲淫性视频| 成人网18免费网站在线| 欧美污视频久久久| 国产成人精品a视频一区www| 在线视频一区二区| 日韩精品中文字幕在线| 这里是久久伊人| 欧美丝袜自拍制服另类| 亚洲激情男女视频| 国产日韩精品视频一区| 99热精品一区二区| 99精品热视频| 高清视频一区二区| 国产乱子伦视频一区二区三区| 国产日韩高清一区二区三区在线| 少妇久久久久| 91精品国偷自产在线电影| 欧美伦理在线视频| 欧美成人激情| 一区二区三区四区日韩| 欧美高清一区| 欧美日韩影院| 久久久久99| 国产精品一区免费在线观看| 奇米影视在线99精品| 99亚洲伊人久久精品影院红桃| 一本色道久久综合一区| 久久精品免费| 国产成人av一区二区三区在线 | 91国内精品野花午夜精品| 欧美激情一区二区在线| 91色在线porny| 91视频精品在这里| 亚洲欧洲成人自拍| 亚洲综合色网站| 91福利在线播放| 亚洲成年网站在线观看| 亚洲欧美日韩精品久久奇米色影视| 精品日产卡一卡二卡麻豆| 亚洲欧美一区二区三区在线| 欧美激情18p| 成人久久久久久| 日韩精品一区二区三区四区五区 | 在线看黄的网站| 色综合久久影院| 精品国产一区二区三区性色av| 成人午夜国产| 日韩不卡一区二区三区| 91天堂素人约啪| 欧美日韩在线一区二区| 久久久av网站| 91深夜福利视频| 国产精品videossex国产高清| 羞羞在线观看网站| 欧美巨大xxxx做受沙滩| 亚洲另类av| 国产风韵犹存在线视精品| 亚洲猫色日本管| 精品久久久三级丝袜| 欧美在线一级视频| 91视频 - 88av| 91高清在线| 黑色丝袜福利片av久久| 日本亚洲欧美天堂免费| 亚洲乱码一区二区三区在线观看| 日韩午夜小视频| 国产日韩av在线播放| 国产亚洲精品网站| 欧美videosex性欧美黑吊| 亚洲v天堂v手机在线| 韩国av一区二区三区| 欧美色综合网站| 韩国v欧美v日本v亚洲| 国产一区喷水| 日韩一级免费片| 成人午夜在线| 黄色精品一二区| 欧美日韩大陆在线| 国产日本欧美在线观看| 91福利国产成人精品播放| 男人添女人下部高潮视频在线观看 | 亚洲影视在线播放| 日韩一区欧美小说| 久久久久久久久久久人体| 熟女熟妇伦久久影院毛片一区二区| 国产精品一二三区视频| 伊人久久大香线蕉无限次| 久久免费国产精品| 亚洲国产古装精品网站| 国产在线播放一区二区| 中国黄色在线视频| 91不卡在线观看| 亚洲一区在线看| 91亚洲精品一区二区| 你懂的在线观看视频网站| 欧美一区激情| 欧美日韩国产精品成人| 看高清中日韩色视频| av在线播放国产| 久久久久国产精品一区二区| 欧美军同video69gay| 亚洲国产午夜伦理片大全在线观看网站 | 亚洲色精品三区二区一区| 91精品国产99久久久久久红楼| 男人天堂999| 你微笑时很美电视剧整集高清不卡| 日本一区二区三区久久久久久久久不 | 国产亚洲精品7777| 国产精品视频一区二区高潮| 黄色片免费在线| 韩日在线一区| 日韩高清a**址| av视屏在线播放| 99久久夜色精品国产亚洲96| 91精品国产综合久久精品app | 国产经典视频一区| 夜夜夜久久久| 久久久国产91| 777.av| 日韩在线播放一区二区| 中文字幕亚洲国产| 999久久欧美人妻一区二区| 一区二区三区在线资源| 欧美日本乱大交xxxxx| 黄色一级片网址| 日韩国产一区| 精品国产一区二区国模嫣然| 日韩中文在线字幕| 美女网站色精品尤物极品姐弟| 欧美性大战久久| 日韩伦理在线免费观看| 99成人超碰| 一区二区三区四区视频| 国产对白国语对白| 日本不卡不码高清免费观看| 国产精品91久久久久久| 第一福利在线视频| 亚洲欧美日韩久久| 亚洲欧美精品在线观看| 竹菊久久久久久久| 亚洲精品91美女久久久久久久| 91香蕉视频导航| 久久久久久9| 亚洲最大成人网色| 日韩人体视频| 裸体女人亚洲精品一区| 自拍av在线| 国产日韩一级二级三级| 一区二区欧美日韩| 免费看日本一区二区| 日韩麻豆第一页| 国产黄在线播放| 一区二区高清视频在线观看| 日韩一级性生活片| 久久一二三区| caoporen国产精品| 亚洲成人黄色| 欧美精品一区二区免费| 在线免费看h| 日韩精品免费看| 婷婷色在线资源| 欧美一区二区三区思思人| 一个人免费视频www在线观看| 亚洲欧美二区三区| 色琪琪丁香婷婷综合久久| 中文字幕一区二区三区蜜月| 国模杨依粉嫩蝴蝶150p| 99在线精品免费| www.欧美黄色| 国产一区在线观看麻豆| 亚洲日本理论电影| 激情综合五月天| 国产在线一区二区三区播放| 欧美国产美女| 青草成人免费视频| 黄色欧美网站| 欧美美最猛性xxxxxx| 国产精品chinese在线观看| 久久国内精品一国内精品| www一区二区三区| 欧美福利视频网站| 成人97精品毛片免费看| 在线电影欧美日韩一区二区私密| xxx欧美xxx| 欧美裸体男粗大视频在线观看| 蜜臀av免费一区二区三区| 国产精品高潮粉嫩av| 国产欧美日韩在线观看视频| 成人精品久久一区二区三区| 日韩午夜激情| 蜜臀av色欲a片无码精品一区| 国产成人av影院| 116极品美女视频在线观看| 日韩欧美亚洲综合| 少妇视频在线| 国产91精品黑色丝袜高跟鞋| 精品五月天堂|