none
vb 线程的问题 RRS feed

  • 问题

  • 我有两个函数,

    myfunc1()

    myfunc2()

    其中要等myfunc1()运行完毕再运行myfunc2()

    在vs2010  vb.net里面怎么用waitfor函数实现?

    2011年12月25日 8:45

答案

  • Thread类似乎没有waitfor函数

    但有几个办法可以达成

    http://stackoverflow.com/questions/1584062/how-to-wait-for-thread-to-finish-with-net

    以下举Join的方式,Sample Code:

    Imports System.Threading
    
    Module Module1
    
        Sub Main()
    
            Dim t1 As New Thread(New ThreadStart(AddressOf myfunc1))
            t1.Start()
    
            t1.Join()
            Dim t2 As New Thread(New ThreadStart(AddressOf myfunc2))
            t2.Start()
    
            Console.ReadKey()
        End Sub
    
        Sub myfunc1()
    
            For i As Integer = 0 To 9999999
            Next
            Console.WriteLine("action1")
    
        End Sub
    
    
        Sub myfunc2()
            Console.WriteLine("action2")
    
        End Sub
    
    End Module
    
    




    2011年12月25日 9:17
  • 非常感谢楼上的回答,我还有个问题:如果要线程1在10秒钟结束该怎么处理?就是如果线程1在十秒钟没有结束,就强制结束,继续运行下一个线程

     

    Sample Code:

    Imports System.Threading
    
    
    Module Module1
    
        Dim t1 As New Thread(New ThreadStart(AddressOf myfunc1))
        Dim t2 As New Thread(New ThreadStart(AddressOf myfunc2))
        Dim timer As New System.Timers.Timer(1000)
        Sub Main()
    
    
            t1.Start()
    
            t1.Join()
    
            t2.Start()
    
            Console.ReadKey()
        End Sub
    
        Sub myfunc1()
    
            AddHandler timer.Elapsed, AddressOf timerElaspse
            timer.AutoReset = True
            timer.Start() '计秒数開始
    
    
            '测试用,延长t1执行时间
            Dim str As String = String.Empty
            For index = 1 To 1000000000000000
                str += index.ToString()
            Next
            Console.WriteLine("action1" + str)
            'End
        End Sub
    
        '计秒数
        Dim count As Integer = 0
        Function timerElaspse() As Object
            count = count + 1
            If count = 10 Then '到了10秒就结束t1
                Try
                    timer.AutoReset = False
                    t1.Abort() '结束t1线程
                Catch ex As Exception
    
                End Try
    
    
            End If
    
    
        End Function
        Sub myfunc2()
            Console.WriteLine("action2")
    
        End Sub
    
    
    End Module
    
    


    • 已标记为答案 Honny_yeyh 2011年12月27日 1:10
    2011年12月26日 16:53

全部回复

  • Thread类似乎没有waitfor函数

    但有几个办法可以达成

    http://stackoverflow.com/questions/1584062/how-to-wait-for-thread-to-finish-with-net

    以下举Join的方式,Sample Code:

    Imports System.Threading
    
    Module Module1
    
        Sub Main()
    
            Dim t1 As New Thread(New ThreadStart(AddressOf myfunc1))
            t1.Start()
    
            t1.Join()
            Dim t2 As New Thread(New ThreadStart(AddressOf myfunc2))
            t2.Start()
    
            Console.ReadKey()
        End Sub
    
        Sub myfunc1()
    
            For i As Integer = 0 To 9999999
            Next
            Console.WriteLine("action1")
    
        End Sub
    
    
        Sub myfunc2()
            Console.WriteLine("action2")
    
        End Sub
    
    End Module
    
    




    2011年12月25日 9:17
  • 非常感谢楼上的回答,我还有个问题:如果要线程1在10秒钟结束该怎么处理?就是如果线程1在十秒钟没有结束,就强制结束,继续运行下一个线程

    2011年12月26日 10:51
  • 非常感谢楼上的回答,我还有个问题:如果要线程1在10秒钟结束该怎么处理?就是如果线程1在十秒钟没有结束,就强制结束,继续运行下一个线程

     

    Sample Code:

    Imports System.Threading
    
    
    Module Module1
    
        Dim t1 As New Thread(New ThreadStart(AddressOf myfunc1))
        Dim t2 As New Thread(New ThreadStart(AddressOf myfunc2))
        Dim timer As New System.Timers.Timer(1000)
        Sub Main()
    
    
            t1.Start()
    
            t1.Join()
    
            t2.Start()
    
            Console.ReadKey()
        End Sub
    
        Sub myfunc1()
    
            AddHandler timer.Elapsed, AddressOf timerElaspse
            timer.AutoReset = True
            timer.Start() '计秒数開始
    
    
            '测试用,延长t1执行时间
            Dim str As String = String.Empty
            For index = 1 To 1000000000000000
                str += index.ToString()
            Next
            Console.WriteLine("action1" + str)
            'End
        End Sub
    
        '计秒数
        Dim count As Integer = 0
        Function timerElaspse() As Object
            count = count + 1
            If count = 10 Then '到了10秒就结束t1
                Try
                    timer.AutoReset = False
                    t1.Abort() '结束t1线程
                Catch ex As Exception
    
                End Try
    
    
            End If
    
    
        End Function
        Sub myfunc2()
            Console.WriteLine("action2")
    
        End Sub
    
    
    End Module
    
    


    • 已标记为答案 Honny_yeyh 2011年12月27日 1:10
    2011年12月26日 16:53
  • Call WaitForSingleObject(pHnd, INFINITE) ' 无限等待,直到程序结束

    我想用这种形式,可是这种形式只针对调用外部程序,不适用于内部函数,有没有针对内部函数的办法?
    2011年12月27日 4:34