4

我正在尝试在应用程序中实现多线程。应用程序需要创建可变数量的线程,同时传递变量。我可以轻松地创建线程,但是我试图找出一种能够立即停止所有线程的方法,如果在这些线程中的任何一个线程中发现错误,请停止所有线程。

我目前的解决方案是将函数封闭在一个循环中,以检查布尔值是否为“True”,在这种情况下线程继续运行。如果出现错误,我将值更改为“False”,所有线程都停止。同样,如果我想手动停止线程,我可以从函数中将值设置为“false”。

有没有更好的解决方案,因为主要问题是线程必须在完全停止之前到达循环的末尾?

4

3 回答 3

2

在 while True 块中运行线程应该没问题。一旦它为假,您就可以遍历线程并调用 thread.abort(),即使有时使用 abort 不是一个好主意。使用线程列表可能会有所帮助。我不知道您是如何创建线程的,但这应该很容易理解。

Dim listThreads As List(Of Threading.Thread)
'create/instantiate your threads adding them to the collection something like the following
For i = 1 To numberofthreadsyouneed
    Dim tempThread As Threading.Thread = New Threading.Thread
    tempThread.Start()
    tempThread.Add(tempThread)
next

不要使用 while 块,只需执行 Try catch。在 catch 内迭代列表以中止线程

Catch ex As Exception
    For each Thread in listThreads
      Thread.Abort()
    Next
end Try
于 2013-07-24T18:01:18.943 回答
2

尝试这个

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim foo As New List(Of Threading.Thread)
    Threading.Interlocked.Exchange(stopRun, 0L)
    For x As Integer = 1 To 5 'start five threads
        Dim t As New Threading.Thread(AddressOf workerThrd)
        t.IsBackground = True
        t.Start()
        foo.Add(t) 'add to list
    Next
    Threading.Thread.Sleep(2000) 'wait two seconds
    Threading.Interlocked.Increment(stopRun) 'signal stop
    For Each t As Threading.Thread In foo 'wait for each thread to stop
        t.Join()
    Next
    Debug.WriteLine("fini")
End Sub

Dim stopRun As Long = 0L

Private Sub workerThrd()
    Do While Threading.Interlocked.Read(stopRun) = 0L
        Threading.Thread.Sleep(10) 'simulate work
    Loop
    Debug.WriteLine("end")
End Sub
于 2013-07-24T18:18:36.080 回答
1

如果你想要更多的控制

这里

是一个非常可爱的东西,叫做任务,他们不久前就出来了。它使您可以更好地控制线程

希望这可以帮助。

于 2013-07-25T17:54:13.477 回答