2017-05-05 151 views
0

我有一个VB.NET控制台程序,其中我在for循环中启动了10个线程。 循环完成后,10个线程将运行,我需要代码暂停(在完成for-loop之后),直到所有线程完成/中止为止。在循环中创建线程并等待所有线程完成/中止

我该怎么办?

这里是例子:

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 
+0

请不要永远永远永远调用'Thread.CurrentThread.Abort()'** **除非你是试图强行关闭你的应用程序。调用'.Abort()'可以使.NET运行时处于无效状态。 – Enigmativity

回答

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 
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