vb.net中如何結(jié)束一個(gè)線程
我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、大祥ssl等。為超過千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的大祥網(wǎng)站制作公司
一般而言,如果您想終止一個(gè)線程,您可以使用System.Threading.Thread類的Abort方法. 例如:
Dim worker As ThreadStart = New ThreadStart(AddressOf workerthreadmethod)
Dim t As Thread = New Thread(worker)
t.Start()
MessageBox.Show("Wait for a while for the thread to start.")
MessageBox.Show(t.ThreadState.ToString())
t.Abort()
MessageBox.Show(t.ThreadState.ToString())
t.Join()
MessageBox.Show(t.ThreadState.ToString())
當(dāng)然,在調(diào)用Abort方法后,線程并不是立刻終止,要等線程的所有finally快中的代碼完成后才會完全終止. 所以在主線程中可以用Join方法來同步,當(dāng)線程還未完全終止時(shí),t.Join()將處于等待,直到t線程完全結(jié)束后再繼續(xù)執(zhí)行后面的語句。
Abort方法是會導(dǎo)致線程跳出一個(gè)異常錯(cuò)誤的,你需要在代碼中捕獲該異常。下面是一個(gè)比較完整的VB.NET線程例子:
Imports System
Imports System.Threading
Public Class MyTestApp
Public Shared Sub Main()
Dim t As New Thread(New ThreadStart(AddressOf MyThreadMethod))
'Start the thread
t.Start()
MsgBox("Are you ready to kill the thread?")
'Kill the child thread and this will cause the thread raise an exception
t.Abort()
' Wait for the thread to exit
t.Join()
MsgBox("The secondary thread has terminated.")
End Sub
Shared Sub MyThreadMethod()
Dim i As Integer
Try
Do While True
Thread.CurrentThread.Sleep(1000)
Console.WriteLine("This is the secondary thread running.")
Loop
Catch e As ThreadAbortException
MsgBox("This thread is going to be terminated by the Abort method in the Main function")
End Try
End Sub
End Class
Thread.Abort()方法用來永久銷毀一個(gè)線程,而且將拋出ThreadAbortException異常。使終結(jié)的線程可以捕獲到異常但是很難控制恢復(fù),僅有的辦法是調(diào)用Thread.ResetAbort()來取消剛才的調(diào)用,而且只有當(dāng)這個(gè)異常是由于被調(diào)用線程引起的異常。因此,A線程可以正確的使用Thread.Abort()方法作用于B線程,但是B線程卻不能調(diào)用Thread.ResetAbort()來取消Thread.Abort()操作。
多線程是用于處理復(fù)雜項(xiàng)目的
打個(gè)比方
你的主程序線程A中有個(gè)循環(huán),由于代碼是一行行走的,所以循環(huán)結(jié)束前下面的代碼無法運(yùn)行,而此時(shí)主界面的反應(yīng)就類似卡死的樣子,你點(diǎn)擊按鈕也沒有反應(yīng),因?yàn)橹骶€程在忙著循環(huán)呢,所以對按鈕的事件代碼要等待了,如果要避免這種情況,就要用到多線程,另開一個(gè)新線程專門用來執(zhí)行循環(huán)代碼,主界面就不會卡死了,只要在循環(huán)結(jié)束后將結(jié)果傳回主線程調(diào)用就可以了,再復(fù)雜點(diǎn)要涉及到委托,控制了
按你的要求其實(shí)你的代碼用不到多線程,只要把sleep放到兩段代碼中間就可以了。
新線程結(jié)束用thread.abort()
簡單回答:
1、當(dāng)前來說,編程與運(yùn)行環(huán)境合適的情況下,VB.net與VB都有實(shí)現(xiàn)多線程的可能。
2、VB、VB.net的最基本的概念,是調(diào)用系統(tǒng)的接口進(jìn)行編程,只要系統(tǒng)提供“多線程”的功能調(diào)用,它們就能實(shí)現(xiàn)多線程。
3、VB注意于面向用戶,面向任務(wù),其高級的一些程序?qū)崿F(xiàn)需要直接調(diào)用win的API,VB實(shí)現(xiàn)多線程的例子也可以在網(wǎng)絡(luò)上搜索到。
一、關(guān)于VB、VB.net的相關(guān)知識:
1、編程指的是用人類能理解的語言來編寫指令集,并通過專用的編譯軟件或環(huán)境來轉(zhuǎn)化這些指令,使得這些指令能讓計(jì)算機(jī)識別,從而控制計(jì)算機(jī)做人類需要進(jìn)行的工作。
2、也就是說無論是VB.NET還是VB它們都只是“人類能理解的語言”,它們通過專用的編譯軟件或環(huán)境來轉(zhuǎn)化這些指令,進(jìn)而操作電腦。
3、進(jìn)一步特化到VB上去說。VB基于VB的運(yùn)行庫,它的運(yùn)行庫又基于win的API((Application Programming Interface,應(yīng)用程序編程接口)是一些預(yù)先定義的函數(shù)),也就是說,VB的很多(多到90%以上)的功能是直接基于調(diào)用windows提供的一些基本接口函數(shù)。
4、VB.net有什么不同呢,它基于.net運(yùn)行庫。什么 意思?這個(gè)意思就是,微軟發(fā)現(xiàn)win的API不夠用了,不好用了,就打算在windows上加裝點(diǎn)東西,讓它有更多的接口函數(shù)。但要注意的是,多數(shù)情況下,這些接口比win的API的效率要低一些。在win7及以后的版本的win中,已經(jīng)自含了.net運(yùn)行庫。
5、順便說,為什么很多人會發(fā)現(xiàn)win7的運(yùn)行速度看起來要比xp慢呢,個(gè)人認(rèn)為就是因?yàn)檎{(diào)用的是.net的接口來實(shí)現(xiàn)的,.net就是比API的慢。當(dāng)然了,.net的功能上要比xp原有的API的功能強(qiáng)。
6、VB與VB.net在語法上是非常近似的,只是因?yàn)閂isual Studio的版本不同,后期的Visual Studio已不提供簡純的VB了,注意它們的不同主要是后臺核心調(diào)用的理念上的不同。
Sub Main()
Dim thr As Thread
For Pi As Integer=0 To 4 //啟用5線程
MulParams =Pi vbTab sFile vbTab dFile vbTab 1 vbTab DelN vbTab cr vbTab cg vbTab cb vbTab IndexI
GlobalParamas(pi)=MulParams .Split(vbTab)
thr=New Thread(AddressOf MyMulThreadCaller)
thr.Start() //啟動多線程進(jìn)程
Application.DoEvents
Next
End Sub
多線程一般是不推薦用的,因?yàn)榫€程之間如果有共享資源的話會引起競爭,需要加鎖處理;而且線程間沒有時(shí)序關(guān)系,所以你在調(diào)試中可能會出現(xiàn)異步處理結(jié)束順序與開始處理順序不一致的情況(我在調(diào)試中已經(jīng)發(fā)現(xiàn)該問題)。
針對你提出的這個(gè)問題,采用了多線程處理,利用的是BackgroundWorker也就是異步處理控件進(jìn)行了處理。
代碼已經(jīng)經(jīng)過調(diào)試通過。歡迎交流,如有問題,留下QQ或其他聯(lián)系方式。
代碼如下,并附程序截圖。
‘---------------------------------------------------
Imports?System.ComponentModel?'導(dǎo)入異步控件命名空間
Public?Class?Form1
Private?howmany?As?Integer?=?10
Private?AnalysisNumber(0?To?howmany?-?1)?As?BackgroundWorker
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
ListBox1.Items.Clear()
creatNewBackgroundWorker()
addHandle()
startWork()
End?Sub
Private?Sub?creatNewBackgroundWorker()
For?i?As?Integer?=?0?To?AnalysisNumber.Length?-?1
AnalysisNumber(i)?=?New?BackgroundWorker
Next
End?Sub
Private?Sub?addHandle()
For?i?As?Integer?=?0?To?AnalysisNumber.Length?-?1
AddHandler?AnalysisNumber(i).DoWork,?AddressOf?AnalysisNumber_DoWork
AddHandler?AnalysisNumber(i).RunWorkerCompleted,?AddressOf?AnalysisNumber_RunWorkerCompleted
Next
End?Sub
Private?Sub?startWork()
For?i?As?Integer?=?0?To?9
Dim?temp(0?To?9)?As?Integer
For?j?As?Integer?=?1?To?10
temp(j?-?1)?=?10?*?i?+?j
Next
AnalysisNumber(i).RunWorkerAsync(temp)
Next
End?Sub
Private?Sub?AnalysisNumber_DoWork(ByVal?sender?As?Object,?ByVal?e?As?System.ComponentModel.DoWorkEventArgs)
Dim?data?As?Integer()
data?=?CType(e.Argument,?Integer())
Dim?temp?As?Integer
For?i?As?Integer?=?0?To?data.Length?-?1
temp?=?data(i)
data(i)?=?temp?*?temp
Next
e.Result?=?data
End?Sub
Private?Sub?AnalysisNumber_RunWorkerCompleted(ByVal?sender?As?Object,?ByVal?e?As?System.ComponentModel.RunWorkerCompletedEventArgs)
Dim?data?As?Integer()
data?=?CType(e.Result,?Integer())
For?i?As?Integer?=?0?To?data.Length?-?1
ListBox1.Items.Add(data(i))
Next
End?Sub
End?Class