扒开腿挺进岳湿润的花苞视频|将军边走边挺进她H树林|挺进朋友人妻张婉莹身体|岳脱得精光让我挺进去视频|第一次挺进莹莹的身体里视频|脱岳裙子从后面挺进去视频

新疆軟件開發(fā)

本站首頁 軟件開發(fā) 成功案例 公司新聞 公司簡(jiǎn)介 客服中心 軟件技術(shù) 網(wǎng)站建設(shè)
  您現(xiàn)在的位置: 新疆二域軟件開發(fā)公司 >> .Net技術(shù) >> 文章正文

多線程技術(shù)在.net中是如何應(yīng)用的

很長(zhǎng)時(shí)間以來,開發(fā)人員一直要求微軟為VB增加更多的線程功能——這一點(diǎn)在VB.NET中終于實(shí)現(xiàn)了。vb6不支持創(chuàng)建多線程的EXE、DLL以及OCX。但這種措詞容易引起誤解,這是因?yàn)閂B6支持執(zhí)行多個(gè)單線程的單元。一個(gè)單元實(shí)際上是代碼執(zhí)行的場(chǎng)所而且單元的邊界限制了外部代碼對(duì)單元內(nèi)部的訪問。
  VB.NET支持創(chuàng)建自由線程的應(yīng)用程序。這意味著多個(gè)線程可以訪問同一個(gè)共享的數(shù)據(jù)集。本文將帶領(lǐng)你了解多線程的基本內(nèi)容。中國(guó)自學(xué)編程網(wǎng)整理。
雖然VB支持多個(gè)單線程的單元,但并不支持允許多個(gè)線程在同一個(gè)數(shù)據(jù)集上運(yùn)行的自由線程模型。在很多情況下,產(chǎn)生一個(gè)運(yùn)行后臺(tái)處理程序的新線程會(huì)提高應(yīng)用程序的可用性。一種很顯然的情況就是當(dāng)執(zhí)行一個(gè)可能使窗體看起來停止響應(yīng)的長(zhǎng)過程時(shí),你一定會(huì)想在窗體上放置一個(gè)取消按鈕。
解決方法
由于VB.NET使用公共語言運(yùn)行時(shí)(Common Language Runtime),它增強(qiáng)了很多新的特性,其中之一便是創(chuàng)建自由線程應(yīng)用程序的能力。
在VB.NET中,開始使利用線程進(jìn)行工作是很容易的。稍后我們會(huì)探究一些精妙之處,我們先創(chuàng)建一個(gè)簡(jiǎn)單的窗體,它生成一個(gè)執(zhí)行后臺(tái)處理程序的新線程。我們需要做的第一件事是將要在新線程上運(yùn)行的后臺(tái)處理程序。下面的代碼執(zhí)行一個(gè)相當(dāng)長(zhǎng)的運(yùn)行過程——一個(gè)無限循環(huán):
Private Sub BackgroundProcess()
  Dim i As Integer = 1
  Do While True
  ListBox1.Items.Add("Iterations: " + i)
  i += 1
  Loop
End Sub
這段代碼無限地循環(huán)并在每次循環(huán)中向窗體上的列表框中增加一個(gè)條目。如果你對(duì)VB.NET不熟悉的話,便會(huì)發(fā)現(xiàn)這段代碼中有一些在VB6中無法完成的事:
l  在聲明變量時(shí)對(duì)其賦值 Dim i As Integer=1
l  使用+=操作符 i+=1代替了i=i+1
l  Call關(guān)鍵字已經(jīng)被去除了
一旦我們有了一個(gè)工作過程,便需要將這段代碼指派給一個(gè)新的線程并開始它的執(zhí)行。完成這項(xiàng)工作,我們需要使用Thread對(duì)象,它是.NET框架類中System.Threading命名空間的一部分。當(dāng)實(shí)例化了一個(gè)新的Thread類時(shí),我們向其傳遞一個(gè)引用,這個(gè)引用指向我們想要在Thread類的構(gòu)造函數(shù)中執(zhí)行的代碼塊。下面的代碼創(chuàng)建一個(gè)新的Thread對(duì)象并將指向BackgroundProcess的引用傳遞給它:
Dim t As Thread
t = New Thread(AddressOf Me.BackgroundProcess)
t.Start()
AddressOf操作符為BackgroundProcess方法創(chuàng)建了一個(gè)委派對(duì)象。委派在VB.NET中是一種類型安全的、面向?qū)ο蟮暮瘮?shù)指針。在線程被實(shí)例化之后,你可以通過調(diào)用線程的Start()方法開始執(zhí)行代碼。
使線程處于控制之下
當(dāng)線程開始之后,你可以通過使用Thread對(duì)象的方法對(duì)其狀態(tài)進(jìn)行一定的控制。你可以通過調(diào)用Thread.Sleep方法暫停線程的執(zhí)行。這個(gè)方法接收一個(gè)表示線程將要休眠多長(zhǎng)時(shí)間的整型數(shù)值。如果在上例中你想要減緩列表框條目的添加,在代碼中放置一個(gè)對(duì)此方法的調(diào)用:
Private Sub BackgroundProcess()
  Dim i As Integer = 1
  Do While True
  ListBox1.Items.Add("Iterations: " + i)
  i += 1
  Thread.CurrentThread.Sleep(2000)
Loop
End Sub
CurrentThread是一個(gè)公共靜態(tài)屬性,它可以使你獲取一個(gè)對(duì)當(dāng)前運(yùn)行線程的引用。
你還可以通過調(diào)用Thread.Sleep (System.Threading.Timeout.Infinite)使一個(gè)線程處于一種時(shí)間不確定的休眠狀態(tài)。要中斷這種休眠,可以調(diào)用Thread.Interrupt 方法。
類似與Sleep和Interrupt的是Suspend和Resume。Suspend允許你阻塞一個(gè)線程直到另外的線程調(diào)用Thread.Resume。Sleep和Suspend之間的區(qū)別在于后者不是立即使一個(gè)線程處于等待狀態(tài)。在.NET運(yùn)行時(shí)確定線程是處于一個(gè)安全的掛起位置之前,線程是不會(huì)掛起的。Sleep則是立即使線程進(jìn)入等待狀態(tài)。
最后,Thread.Abort中止一個(gè)線程的執(zhí)行。在我們的簡(jiǎn)單例子中,我們還想增加另外一個(gè)可以使我們中止程序的按鈕。要完成這些,我們所需做的一切便是如下面這樣調(diào)用Thread.Abort方法:
Private Sub Button2_Click(ByVal sender As System.object, _
  ByVal e As System.EventArgs) Handles Button2.Click
  t.Abort()
End Sub
在此便可以看出多線程的能力。用戶界面看起來對(duì)用戶是有響應(yīng)的,因?yàn)樗\(yùn)行在一個(gè)線程中而后臺(tái)的處理程序運(yùn)行在另一個(gè)線程中。取消按鈕會(huì)立即響應(yīng)用戶的click事件同時(shí)處理過程被中止。
通過多線程的過程傳遞數(shù)據(jù)
上一個(gè)例子展示了一種相當(dāng)簡(jiǎn)單的情況。在你編程的時(shí)候,多線程有很多需要解決的復(fù)雜問題。你將會(huì)遇到的一個(gè)問題是向傳遞給Thread類構(gòu)造函數(shù)的過程傳遞數(shù)據(jù)以及從這個(gè)過程傳出數(shù)據(jù)。換言之,你想要在另一個(gè)線程上開始的過程不能接收任何參數(shù)而且你也不能從這個(gè)過程返回任何數(shù)據(jù)。這是因?yàn)閭鬟f給線程構(gòu)造函數(shù)的過程不能有任何參數(shù)或返回值。為了避開這個(gè)問題,將你的過程包裝到一個(gè)類中,在這個(gè)類中此方法的參數(shù)被表示成類的一個(gè)域。
有一個(gè)簡(jiǎn)單的例子,如果我們有一個(gè)計(jì)算一個(gè)數(shù)的平方的過程:
Function Square(ByVal Value As Double) As Double
  Return Value * Value
End Function
為了使這個(gè)過程可以在一個(gè)新線程中使用,我們將其包裝到一個(gè)類中:
Public Class SquareClass
  Public Value As Double
  Public Square As Double
  Public Sub CalcSquare()
  Square = Value * Value
  End Sub
End Class
使用這些代碼在一個(gè)新線程中啟動(dòng)CalcSquare過程,代碼如下:
Private Sub Button1_Click(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles Button1.Click
  Dim oSquare As New SquareClass()
  t = New Thread(AddressOf oSquare.CalcSquare)
  oSquare.Value = 30
  t.Start()
End Sub
注意當(dāng)線程開始后,我們沒有檢查類的平方值,因?yàn)椴⒉荒鼙WC一旦你調(diào)用線程Start方法,它便會(huì)執(zhí)行。有一些方法可以從另外的線程中獲取這個(gè)值。最簡(jiǎn)單的方法是當(dāng)線程完成時(shí)引發(fā)一個(gè)事件。我們會(huì)在下一個(gè)部分線程同步中討論另外一種方法。下面的代碼為SquareClass增加了事件聲明。
Public Class SquareClass
  Public Value As Double
  Public Square As Double
  Public Event ThreadComplete(ByVal Square As Double)
  Public Sub CalcSquare()
  Square = Value * Value
  RaiseEvent ThreadComplete(Square)
  End Sub
End Class
在調(diào)用代碼中捕獲這個(gè)事件與VB6相比沒有太大的變化,仍然是用WithEvents聲明變量并在一個(gè)過程中處理事件。變化的部分是用Handles關(guān)鍵字聲明處理事件的過程并且不再使用像VB6中Object_Event的命名約定。
Dim WithEvents oSquare As SquareClass
 
Private Sub Button1_Click(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles Button1.Click
  oSquare = New SquareClass()
  t = New Thread(AddressOf oSquare.CalcSquare)
  oSquare.Value = 30
  t.Start()
End Sub
 
Sub SquareEventHandler(ByVal Square As Double) _
  Handles oSquare.ThreadComplete
  MsgBox("The square is " & Square)
End Sub
這個(gè)方法需要注意的一個(gè)問題是處理事件的過程,在本例中是SquareEventHandler,將運(yùn)行在引發(fā)事件的線程中,而不是運(yùn)行在窗體從中執(zhí)行的線程中。
線程同步
VB.NET包含了一些語句用于提供線程的同步。在Square的例子中,你可能想同步執(zhí)行計(jì)算的線程以便等到計(jì)算完成,這樣便可以獲得結(jié)果。舉另外一個(gè)例子,如果你在一個(gè)單獨(dú)的線程中對(duì)數(shù)組進(jìn)行排序并且在使用這個(gè)數(shù)組之前要等待這個(gè)處理過程結(jié)束。為了實(shí)現(xiàn)這些同步,VB.NET提供了SyncLock語句和Thread.Join方法。
SyncLock獲取了對(duì)傳遞給它的對(duì)象引用的獨(dú)占性鎖。通過取得這種獨(dú)占鎖,你可以確保多個(gè)線程不會(huì)訪問共享的數(shù)據(jù)或是在多個(gè)線程上執(zhí)行代碼。一個(gè)可以方便地用于獲取鎖地對(duì)象是關(guān)聯(lián)于每個(gè)類的System.Type對(duì)象?梢酝ㄟ^GetType方法獲得System.Type對(duì)象:
Public Sub CalcSquare()
  SyncLock GetType(SquareClass)
  Square = Value * Value
  End SyncLock
End Sub
最后,Thread.Join方法允許你等待一段特定的時(shí)間直到一個(gè)線程結(jié)束。如果線程在你所確定的時(shí)間之前完成,Thread.Join返回True,否則的話返回False。在Square的例子中,如果我們不想引發(fā)事件,可以調(diào)用Thread.Join方法來確定計(jì)算是否已經(jīng)結(jié)束。代碼如下所示:
Private Sub Button1_Click(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles Button1.Click
  Dim oSquare As New SquareClass()
   t = New Thread(AddressOf oSquare.CalcSquare)
  oSquare.Value = 30
  t.Start()
  If t.Join(500) Then
  MsgBox(oSquare.Square)
  End If
End Sub

 

作者:未知 | 文章來源:未知 | 更新時(shí)間:2007-12-15 16:37:36

  • 上一篇文章:

  • 下一篇文章:

  • 相關(guān)文章:
    Java語言學(xué)習(xí):jAVA中 的多線程淺析
    如何在VB.net錄入驗(yàn)證?
    基礎(chǔ)學(xué)習(xí):VB.NET順序文件的操作方法
    基礎(chǔ)學(xué)習(xí):VB.NET隨機(jī)文件的操作方法
    VB.NET語法基礎(chǔ)知識(shí)學(xué)習(xí)
    VB.NET完善的面向?qū)ο笾С?/a>
    VB.NET對(duì)象的廣泛應(yīng)用
    VB.NET公共運(yùn)行時(shí)的環(huán)境
    java多線程SOCKET程序的問題
    教程:.Net多線程和Windows Forms編程
    軟件技術(shù)
    · 開發(fā)語言
    · Java技術(shù)
    · .Net技術(shù)
    · 數(shù)據(jù)庫開發(fā)
    最新文章  
    ·.net技術(shù) asp.net MVC3 Vi
    ·.net將視頻文件格式轉(zhuǎn)換成
    ·NET Framework 2.0 Servic
    ·如何動(dòng)態(tài)修改winform的app
    ·asp,net軟件結(jié)構(gòu)設(shè)計(jì)和相關(guān)
    ·學(xué)習(xí)怎樣使用ASP.NET中的虛
    ·,net基礎(chǔ)類的學(xué)習(xí):system
    ·.net學(xué)習(xí):c#事件的深入分
    ·Facade Pattern學(xué)習(xí)總結(jié)
    ·C#如何設(shè)置或者獲取目錄的
    ·如何使用XSL來定義ASP.NET
    ·理解WCF Data Contract契約
    ·如何能在.net2.0開發(fā)的控件
    ·模式怎樣使用,講解模式的
    ·如何解決Menu菜單被frame遮
    關(guān)于我們 | 軟件開發(fā) | 下載試用 | 客服中心 | 聯(lián)系我們 | 友情鏈接 | 網(wǎng)站地圖 | 新疆電子地圖 | RSS訂閱
    版權(quán)所有 © 2016 新疆二域軟件開發(fā)網(wǎng) m.jdtbank.com All Rights Reserved 新ICP備14003571號(hào)
    新疆軟件開發(fā)總機(jī):0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆烏魯木齊北京中路華聯(lián)大廈A-5C 郵編:830000
     
    汶上县| 多伦县| 江达县| 桃园市| 忻城县| 三明市| 屏山县| 策勒县| 扶余县| 康乐县| 沐川县| 南汇区| 岳阳市| 林州市| 兰坪| 霍山县| 台北市| 万荣县| 滦平县| 渑池县| 双桥区| 西安市| 孟村| 台南县| 运城市| 上思县| 穆棱市| 荣昌县| 鞍山市| 边坝县| 河曲县| 巴彦淖尔市| 阿勒泰市| 丹棱县| 宜兴市| 平湖市| 寿光市| 金寨县| 香港 | 龙井市| 二连浩特市|