在循环中创建线程并等待所有线程完成/中止

时间:2017-05-05 00:39:00

标签: vb.net

我有一个VB.NET控制台程序,我在for循环中启动了10个线程。 循环结束后,10个线程将运行,我需要代码暂停(完成for循环后),直到所有线程完成/中止。

我该怎么做?

以下是示例:

Private Sub TheProcessThread()

    While True

        'some coding
        If 1 = 1 Then

        End If

    End While

    Console.WriteLine("Aborting Thread...")
    Thread.CurrentThread.Abort()

End Sub

Sub Main()

    Dim f as Integer
    Dim t As Thread
    For f = 0 To 10
        t = New Thread(AddressOf TheProcessThread)
        t.Start()
    Next

    ' HERE !! how I can be sure that all threads are finished/aborted for continue with the code below ?
    ' more vb.net code...
End Sub

2 个答案:

答案 0 :(得分:0)

这应该有所帮助。我对你的代码进行了一些修改,但它基本上是一样的。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim f As Integer
    Dim t As Task
    Dim l As New List(Of Task)
    For f = 0 To 10
        t = New Task(AddressOf TheProcessThread)
        t.Start()
        l.Add(t)
    Next

    ' HERE !! how I can be sure that all threads are finished/aborted for continue with the code below ?
    ' more vb.net code...    End Sub
    Task.WaitAll(l.ToArray) 'wait for all threads to complete
    Stop
End Sub

Private Sub TheProcessThread()

    While True

        'some coding
        If 1 = 1 Then
            Threading.Thread.Sleep(1000)
            Exit While
        End If

    End While

    Console.WriteLine("Aborting Thread...")
    'Thread.CurrentThread.Abort() 'End Sub causes thread to end

End Sub

答案 1 :(得分:0)

保持简单和老派,只需像这样使用Join()

Imports System.Threading

Module Module1

    Private R As New Random

    Sub Main()
        Dim threads As New List(Of Thread)
        For f As Integer = 0 To 10
            Dim t As New Thread(AddressOf TheProcessThread)
            threads.Add(t)
            t.Start()
        Next
        Console.WriteLine("Waiting...")
        For Each t As Thread In threads
            t.Join()
        Next

        Console.WriteLine("Done!")
        Console.ReadLine()
    End Sub

    Private Sub TheProcessThread()
        Thread.Sleep(R.Next(3000, 10001))
        Console.WriteLine("Thread Complete.")
    End Sub

End Module