VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > VB.net教程 >
  • vb.net 教程 6-14 终止线程的例子

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

在有些时候需要主动终止某个线程,这时可以调用Thread.Abort方法。
例如以下的代码:

使用到的类:


  1.  
    Class clsSum2
  2.  
    Public inputNum As Integer
  3.  
    Public currentNum As Integer
  4.  
    Public outputSum As Integer
  5.  
    End Class

主线程代码:


  1.  
    Sub sample9()
  2.  
    Dim maxNum As Integer = 20
  3.  
    Dim sumNumber As New clsSum2
  4.  
    sumNumber.inputNum = maxNum
  5.  
     
  6.  
    Dim sample9_Thread As New Thread(AddressOf sample9_getSum)
  7.  
    sample9_Thread.Start(sumNumber)
  8.  
     
  9.  
    Do Until sumNumber.currentNum >= 10
  10.  
    Thread.Sleep(100)
  11.  
    Loop
  12.  
    sample9_Thread.Abort()
  13.  
    Console.WriteLine("终止时运行到:{0},和为:{1}", sumNumber.currentNum, sumNumber.outputSum)
  14.  
    Console.ReadKey()
  15.  
    End Sub
  16.  
     
  17.  
    Sub sample9_getSum(ByVal obj As Object)
  18.  
    Dim testSum As New clsSum2
  19.  
    testSum = CType(obj, clsSum2)
  20.  
    Dim sum As Integer = 0
  21.  
    For i As Integer = 0 To testSum.inputNum
  22.  
    sum += i
  23.  
    testSum.currentNum = i
  24.  
    Thread.Sleep(100)
  25.  
    Next
  26.  
    testSum.outputSum = sum
  27.  
    End Sub

原本我们希望当子线程中循环求和计算到10时就停止并输出和值,但是实际常常得到的结果是:

或者

也就是说,根本没有运行到testSum.outputSum=sum,这就需要随时保存outputSum的值。 修改后的代码如下:


  1.  
    Sub sample9()
  2.  
    Dim maxNum As Integer = 20
  3.  
    Dim sumNumber As New clsSum2
  4.  
    sumNumber.inputNum = maxNum
  5.  
     
  6.  
    Dim sample9_Thread As New Thread(AddressOf sample9_getSum)
  7.  
    sample9_Thread.Start(sumNumber)
  8.  
     
  9.  
    Do Until sumNumber.currentNum >= 10
  10.  
    Thread.Sleep(100)
  11.  
    Loop
  12.  
    sample9_Thread.Abort()
  13.  
    Console.WriteLine("终止时运行到:{0},和为:{1}", sumNumber.currentNum, sumNumber.outputSum)
  14.  
    Console.ReadKey()
  15.  
    End Sub
  16.  
     
  17.  
    Sub sample9_getSum(ByVal obj As Object)
  18.  
    Dim testSum As New clsSum2
  19.  
    testSum = CType(obj, clsSum2)
  20.  
    Dim sum As Integer = 0
  21.  
    For i As Integer = 0 To testSum.inputNum
  22.  
    sum += i
  23.  
    testSum.currentNum = i
  24.  
    Thread.Sleep(100)
  25.  
    testSum.outputSum = sum
  26.  
    Next
  27.  
    End Sub

运行结果:

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

在有些时候需要主动终止某个线程,这时可以调用Thread.Abort方法。
例如以下的代码:

使用到的类:

Class clsSum2
    Public inputNum As Integer
    Public currentNum As Integer
    Public outputSum As Integer
End Class
主线程代码:

    Sub sample9()
        Dim maxNum As Integer = 20
        Dim sumNumber As New clsSum2
        sumNumber.inputNum = maxNum
 
        Dim sample9_Thread As New Thread(AddressOf sample9_getSum)
        sample9_Thread.Start(sumNumber)
 
        Do Until sumNumber.currentNum >= 10
            Thread.Sleep(100)
        Loop
        sample9_Thread.Abort()
        Console.WriteLine("终止时运行到:{0},和为:{1}", sumNumber.currentNum, sumNumber.outputSum)
        Console.ReadKey()
    End Sub
 
    Sub sample9_getSum(ByVal obj As Object)
        Dim testSum As New clsSum2
        testSum = CType(obj, clsSum2)
        Dim sum As Integer = 0
        For i As Integer = 0 To testSum.inputNum
            sum += i
            testSum.currentNum = i
            Thread.Sleep(100)
        Next
        testSum.outputSum = sum
    End Sub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

原本我们希望当子线程中循环求和计算到10时就停止并vb.net教程输出和值,但是实际常常得到的结果是:

在这里插入图片描述

或者 在这里插入图片描述

也就是说,根本没有运行到testSum.outputSum=sum,这就需要随时保存outputSum的值。 修改后的代码如下:

Sub sample9()
    Dim maxNum As Integer = 20
    Dim sumNumber As New clsSum2
    sumNumber.inputNum = maxNum
 
    Dim sample9_Thread As New Thread(AddressOf sample9_getSum)
    sample9_Thread.Start(sumNumber)
 
    Do Until sumNumber.currentNum >= 10
        Thread.Sleep(100)
    Loop
    sample9_Thread.Abort()
    Console.WriteLine("终止时运行到:{0},和为:{1}", sumNumber.currentNum, sumNumber.outputSum)
    Console.ReadKey()
End Sub
 
Sub sample9_getSum(ByVal obj As Object)
    Dim testSum As New clsSum2
    testSum = CType(obj, clsSum2)
    Dim sum As Integer = 0
    For i As Integer = 0 To testSum.inputNum
        sum += i
        testSum.currentNum = i
        Thread.Sleep(100)
        testSum.outputSum = sum
    Next
End Sub
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

运行结果:

在这里插入图片描述

或者主线程大意了,放子线程多运行了一次循环: 在这里插入图片描述

这个例子说明了些问题: 1、线程其实并不好控制,需要多练习 2、将输出值放到了循环内部,每次循环都运行一次,实际占用了资源

在下一节将讲述如何更好的控制线程的终止。

或者主线程大意了,放子线程多运行了一次循环:

这个例子说明了些问题: 1、线程其实并不好控制,需要多练习 2、将输出值放到了循环内部,每次循环都运行一次,实际占用了资源

在下一节将讲述如何更好的控制线程的终止。
 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/uruseibest/article/details/87897228

相关教程