Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如果在其中一个线程中检测到错误,则停止所有线程_Vb.net_Multithreading - Fatal编程技术网

Vb.net 如果在其中一个线程中检测到错误,则停止所有线程

Vb.net 如果在其中一个线程中检测到错误,则停止所有线程,vb.net,multithreading,Vb.net,Multithreading,我正在尝试在应用程序中实现多线程。应用程序在传递变量时需要创建可变数量的线程。我可以很容易地创建线程,但是我正在试图找到一种方法,能够一次停止所有线程,如果在其中任何一个线程中发现错误,请停止所有线程 我目前的解决方案是将函数封装在一个循环中,该循环检查布尔值是否为“True”,在这种情况下线程将继续执行。如果有错误,我将该值更改为“False”,所有线程停止。类似地,如果我想手动停止线程,我可以从函数中将该值设置为“false” 有没有更好的解决方案,因为主要问题是线程必须在完全停止之前到达循

我正在尝试在应用程序中实现多线程。应用程序在传递变量时需要创建可变数量的线程。我可以很容易地创建线程,但是我正在试图找到一种方法,能够一次停止所有线程,如果在其中任何一个线程中发现错误,请停止所有线程

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


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

在while True块中运行线程应该可以。如果它为false,您可以迭代线程并调用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
试试这个

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

如果你想要更多的控制

这是一个非常可爱的东西,叫做任务,他们不久前就推出了。它使您对线程有了更多的控制


希望这能有所帮助。

当你说“捕获错误”时,你的意思是它在线程中引发异常,还是你的代码仅仅检测到某种错误?两者都在try-catch块中,还有我自己的东西来检查错误没有任何解决方案可以让这更容易。除了实际可行的解决方案之外,如果不声明布尔值为volatile,那么它就不是线程安全的,这在VB.NET中是无法做到的。将重点放在任务和CancellationToken上。每当你做线程,首先让一个工作。您使用的.System.Environment.Exit(exitCode)越多,它的难度就越大。这将立即停止所有线程,没有问题。提供更多细节如何?也许是一个简短的代码示例?如果线程中止并不总是一个好主意,您能建议一个替代方案吗?谢谢简单地中止线程是快速而肮脏的方法。如果突然终止您正在运行的所有线程是理想的结果,那么应该可以。感谢您的输入,这并不能解决线程不能立即停止的问题,除非我在每行代码后检查boolean=false