亚洲欧洲国产欧美一区精品,激情五月亚洲色五月,最新精品国偷自产在线婷婷,欧美婷婷丁香五月天社区

      考試首頁(yè) | 考試用書(shū) | 培訓(xùn)課程 | 模擬考場(chǎng) | 考試論壇  
        當(dāng)前位置:編程開(kāi)發(fā) > DotNET > VB.Net > 文章內(nèi)容
        

      VB.NET教程:VB.NET多線程應(yīng)用

       [ 2017年8月19日 ] 【

        開(kāi)發(fā)者一直要求微軟為VB加入更多的多線程功能,對(duì)于VB.NET也是這樣。VB6已經(jīng)支持建立多線程的EXE、DLL和OCX。不過(guò)使用多線程這個(gè)詞語(yǔ),可能也不太確切。因此VB6僅支持運(yùn)行多個(gè)單線程的單元。一個(gè)單元實(shí)際上是代碼執(zhí)行的空間,而單元的邊界限制了代碼訪問(wèn)任何單元以外的事物。

        VB.NET就不同了,它支持建立自由線程(free-threaded)的應(yīng)用。這意味著多個(gè)線程可以訪問(wèn)同樣一套的共享數(shù)據(jù)。本文的以下部分將討論一下多線程的一些基本點(diǎn)。

        問(wèn)題

        雖然VB6支持多個(gè)單線程的單元,不過(guò)它并不支持一個(gè)自由線程的模型,即不允許多個(gè)線程使用同一套數(shù)據(jù)。在許多的情況下,你需要建立一個(gè)新的線程來(lái)進(jìn)行后臺(tái)的處理,這樣可提高應(yīng)用的可用性,否則,一個(gè)長(zhǎng)的處理就可以令程序的響應(yīng)變得很慢,例如你按下表格上的一個(gè)取消按鈕,卻很久都沒(méi)有響應(yīng)。

        解決辦法

        由于VB.NET使用了CLR(Common Language Runtime),從而擁有了許多的新特性,其中的一個(gè)是可以創(chuàng)建自由線程的應(yīng)用。

        使用線程

        在VB.NET中,運(yùn)用線程是很簡(jiǎn)單的。我們將在后面涉及其中的細(xì)節(jié),現(xiàn)在我們首先來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的表格,它使用一個(gè)新的線程來(lái)運(yùn)行一個(gè)后臺(tái)處理。第一件要做的事情是創(chuàng)建運(yùn)行在新線程上的后臺(tái)任務(wù)。以下的代碼執(zhí)行一個(gè)相當(dāng)長(zhǎng)的運(yùn)行處理--一個(gè)無(wú)限的循環(huán):

        Private Sub BackgroundProcess()

        Dim i As Integer = 1

        Do While True

        ListBox1.Items.Add("Iterations: " + i)

        i += 1

        Loop

        End Sub

        這段代碼無(wú)限地循環(huán),并且在每次執(zhí)行時(shí)為表格上的一個(gè)列表框加入一個(gè)項(xiàng)目。如果你對(duì)VB.NET不熟悉的話,你將會(huì)發(fā)現(xiàn)這段代碼和VB6的有一些區(qū)別:

        . 在聲明變量Dim i As Integer = 1時(shí)賦值

        . 使用+=操作符i += 1代替i = i + 1

        . 沒(méi)有使用Call關(guān)鍵字

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

        Dim t As Thread

        t = New Thread(AddressOf Me.BackgroundProcess)

        t.Start()

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

        控制線程

        在線程啟動(dòng)后,你可以通過(guò)線程對(duì)象的一個(gè)方法來(lái)控制它的狀態(tài)。你可以通過(guò)調(diào)用Thread.Sleep方法來(lái)暫停一個(gè)線程的執(zhí)行,這個(gè)方法可以接收一個(gè)整型值,用來(lái)決定線程休眠的時(shí)間。拿前面的例子來(lái)說(shuō),如果你想讓列表項(xiàng)目增加的速度變慢,可以在其中放入一個(gè)sleep方法的調(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è)public static的屬性值,可讓你得到當(dāng)前運(yùn)行線程的一個(gè)引用。

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

        與休眠和中斷類似的是掛起和恢復(fù)。掛起可讓你暫停一個(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)。

        最后要介紹的是Thread.Abort,它會(huì)停止一個(gè)線程的執(zhí)行。在我們的那個(gè)簡(jiǎn)單例子中,如果要加入一個(gè)按鈕來(lái)停止處理,很簡(jiǎn)單,我們只要調(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

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

        上面的例子只是一個(gè)相當(dāng)簡(jiǎn)單的應(yīng)用。在編程時(shí),你還需要使用到多線程的許多復(fù)雜特性。其中的一個(gè)問(wèn)題是如何將程序的數(shù)據(jù)由線程類的構(gòu)造器傳入或者傳出,也就是說(shuō),對(duì)于放到另外一個(gè)線程中的過(guò)程,你既不能傳參數(shù)給它,也不能由它返回值。這是由于你傳入到線程構(gòu)造器的過(guò)程是不能擁有任何的參數(shù)或者返回值的。為了解決這個(gè)問(wèn)題,可以將你的過(guò)程封裝到一個(gè)類中,這樣方法的參數(shù)就可使用類中的字段。

        這里我們舉一個(gè)簡(jiǎn)單的例子,如果我們要計(jì)算一個(gè)數(shù)的平方,即:

      首頁(yè) 1 2 尾頁(yè)
      將考試網(wǎng)添加到收藏夾 | 每次上網(wǎng)自動(dòng)訪問(wèn)考試網(wǎng) | 復(fù)制本頁(yè)地址,傳給QQ/MSN上的好友 | 申請(qǐng)鏈接 | 意見(jiàn)留言 TOP
      關(guān)于本站  網(wǎng)站聲明  廣告服務(wù)  聯(lián)系方式  站內(nèi)導(dǎo)航  考試論壇
      Copyright © 2007-2013 中華考試網(wǎng)(Examw.com) All Rights Reserved