vb.net中如何結(jié)束一個(gè)線(xiàn)程
成都網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序開(kāi)發(fā)、集團(tuán)成都定制網(wǎng)頁(yè)設(shè)計(jì)等服務(wù)項(xiàng)目。核心團(tuán)隊(duì)均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗(yàn),服務(wù)眾多知名企業(yè)客戶(hù);涵蓋的客戶(hù)類(lèi)型包括:主動(dòng)防護(hù)網(wǎng)等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗(yàn),同時(shí)也獲得了客戶(hù)的一致認(rèn)可!
一般而言,如果您想終止一個(gè)線(xiàn)程,您可以使用System.Threading.Thread類(lèi)的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方法后,線(xiàn)程并不是立刻終止,要等線(xiàn)程的所有finally快中的代碼完成后才會(huì)完全終止. 所以在主線(xiàn)程中可以用Join方法來(lái)同步,當(dāng)線(xiàn)程還未完全終止時(shí),t.Join()將處于等待,直到t線(xiàn)程完全結(jié)束后再繼續(xù)執(zhí)行后面的語(yǔ)句。
Abort方法是會(huì)導(dǎo)致線(xiàn)程跳出一個(gè)異常錯(cuò)誤的,你需要在代碼中捕獲該異常。下面是一個(gè)比較完整的VB.NET線(xiàn)程例子:
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()方法用來(lái)永久銷(xiāo)毀一個(gè)線(xiàn)程,而且將拋出ThreadAbortException異常。使終結(jié)的線(xiàn)程可以捕獲到異常但是很難控制恢復(fù),僅有的辦法是調(diào)用Thread.ResetAbort()來(lái)取消剛才的調(diào)用,而且只有當(dāng)這個(gè)異常是由于被調(diào)用線(xiàn)程引起的異常。因此,A線(xiàn)程可以正確的使用Thread.Abort()方法作用于B線(xiàn)程,但是B線(xiàn)程卻不能調(diào)用Thread.ResetAbort()來(lái)取消Thread.Abort()操作。
好像不難吧?
我放進(jìn)了Button1的Click事件里。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
On Error GoTo Errmessages '在做系統(tǒng)操作時(shí)加排錯(cuò)標(biāo)簽是個(gè)好習(xí)慣
Dim TargetName As String = "ibmdict" '存儲(chǔ)進(jìn)程名為文本型,注:進(jìn)程名不加擴(kuò)展名
Dim TargetKill() As Process = Process.GetProcessesByName(TargetName) '從進(jìn)程名獲取進(jìn)程
Dim TargetPath As String '存儲(chǔ)進(jìn)程路徑為文本型
If TargetKill.Length 1 Then '判斷進(jìn)程名的數(shù)量,如果同名進(jìn)程數(shù)量在2個(gè)以上,用For循環(huán)關(guān)閉進(jìn)程。
For i = 0 To TargetKill.Length - 1
TargetPath = TargetKill(i).MainModule.FileName
TargetKill(i).Kill()
Next
ElseIf TargetKill.Length = 0 Then '判斷進(jìn)程名的數(shù)量,沒(méi)有發(fā)現(xiàn)進(jìn)程直接彈窗。不需要的,可直接刪掉該If子句
MsgBox("沒(méi)有發(fā)現(xiàn)進(jìn)程!")
Exit Sub
ElseIf TargetKill.Length = 1 Then '判斷進(jìn)程名的數(shù)量,如果只有一個(gè),就不用For循環(huán)
TargetKill(0).Kill()
End If
MsgBox("已終止" TargetKill.Length "個(gè)進(jìn)程") '彈窗提示已終止多少個(gè)進(jìn)程
Errmessages: ‘定義排錯(cuò)標(biāo)簽
If Err.Description Nothing Then ’判斷有無(wú)錯(cuò)誤,如果有,則 ↓
MsgBox(Err.Description) '當(dāng)出現(xiàn)錯(cuò)誤時(shí),彈窗提示
End If
End Sub
可根據(jù)需要自行修改,這個(gè)備注夠完善了吧?不會(huì)的再Hi我。
實(shí)話(huà)說(shuō),我從來(lái)沒(méi)聽(tīng)說(shuō)VB里有return語(yǔ)句,如果是VB.net里有的就當(dāng)我沒(méi)學(xué)過(guò)孤陋寡聞吧。
我只知道VB里跳出循環(huán)是Exit for,而不是什么return。
先不說(shuō)有沒(méi)有return關(guān)鍵字,明顯它在j循環(huán)的外面,而在i循環(huán)的里面,那自然是只對(duì)i循環(huán)有效果了,怎么可能結(jié)束j循環(huán)呢?
如果要結(jié)束i循環(huán)就在那個(gè)位置用exit for。如果要線(xiàn)束j循環(huán)就在j循環(huán)體里用 exit for。
exit for 只結(jié)束包含它的最近的一層的循環(huán),懂我的意思么?
return在其它語(yǔ)言里,是表示返回,跳出整個(gè)函數(shù),而不是跳出某個(gè)循環(huán)。
要弄清楚這兩個(gè)問(wèn)題,就要明白For循環(huán)語(yǔ)句的語(yǔ)法規(guī)則:
For循環(huán)語(yǔ)句,首先是判斷循環(huán)條件,如果循環(huán)條件不合理,則循環(huán)不執(zhí)行。
那么看第一個(gè)語(yǔ)句,循環(huán)范圍是 i = -3.5 to 5.5,顯然這個(gè)是一個(gè)從-3.5到5.5的遞增范圍,可是后面的Step卻是一個(gè)負(fù)數(shù),表示以0.5的步長(zhǎng)遞減。取值范圍要求從小到大,可是步長(zhǎng)改變卻是由大變小,顯然這個(gè)循環(huán)條件自相矛盾,所以循環(huán)將不會(huì)執(zhí)行,也就是循環(huán)執(zhí)行的次數(shù)是0次!
如果循環(huán)條件合理,則開(kāi)始執(zhí)行循環(huán)語(yǔ)句,直到根據(jù)步長(zhǎng)變換,下一個(gè)值超出循環(huán)范圍則終止。
For j = 6 to 2 Step -2
Next
完整寫(xiě)法就是:
For j = 6 to 2 Step -2
Next j
Next j的意思就是下一個(gè)j值。結(jié)合本題,下一個(gè)j值等于6-2=4,這個(gè)時(shí)候,就是循環(huán)語(yǔ)句的第二個(gè)規(guī)則,判斷循環(huán)變量的值是否超出循環(huán)范圍,我們這里的j=4,顯然是在6 to 2這個(gè)范圍之內(nèi),所以循環(huán)繼續(xù),到下一個(gè)j的時(shí)候?yàn)?,依然在循環(huán)范圍內(nèi);到這里,6,4,2我們的循環(huán)執(zhí)行了3次,準(zhǔn)備第4次循環(huán)的時(shí)候j = 2 -2 = 0超過(guò)了6 to 2這個(gè)范圍,那么循環(huán)終止。
所以i循環(huán)內(nèi)的每一個(gè)j循環(huán)將執(zhí)行3次。
定義一個(gè)公有布爾值變量 flag,初始值 False。
循環(huán)里最開(kāi)始 If 判斷一下 flag,如果為 True 就 Exit Do 跳出循環(huán),否則繼續(xù)循環(huán)。
然后在別的函數(shù)控制 flag 的值就可以了。
P.S. 你這段代碼是死循環(huán),直到程序占用內(nèi)存越來(lái)越大溢出進(jìn)而程序崩潰為止……