Vb.net 在执行下一步之前,等待线程完成

Vb.net 在执行下一步之前,等待线程完成,vb.net,multithreading,winforms,Vb.net,Multithreading,Winforms,一、 在任何时候,最多有两个线程运行。在执行下一步之前,如何等待这些线程完成 如果我不等待它们,我会在检查值时得到一个NullReferenceException,因为由于线程仍在运行,这些值尚未设置。如果调用join,则主线程将等待另一个线程完成。我认为下面的代码有助于理解这个想法 Sub Main() thread = New System.Threading.Thread(AddressOf countup) thread.Start() t

一、 在任何时候,最多有两个线程运行。在执行下一步之前,如何等待这些线程完成


如果我不等待它们,我会在检查值时得到一个
NullReferenceException
,因为由于线程仍在运行,这些值尚未设置。

如果调用join,则主线程将等待另一个线程完成。我认为下面的代码有助于理解这个想法

Sub Main()
        thread = New System.Threading.Thread(AddressOf countup)
        thread.Start()
        thread2 = New System.Threading.Thread(AddressOf countup2)
        thread2.Start()
        thread.Join() 'wait thread to finish
        thread2.Join()  'wait thread2 to finish
        Console.WriteLine("All finished ")
        Console.ReadKey()
    End Sub
请参阅以下链接: ;

在这个问题上,我会采用异步/等待模式。它为您提供了出色的流控制,不会锁定您的UI

以下是一个很好的例子:


基本思想是创建一个
任务
数组(这些可以指向返回
任务
的函数)。这会将在调用
task.whalll
时运行的任务对象中包装的“线程”排队,这些线程将执行数组中的所有任务,并在所有任务完成后继续。之后的代码将在每个任务完成后运行,但它不会阻止UI线程。

您是否考虑过使用Async/Await或任务并行库而不是原始线程?能否提供有关它们的文章链接?这是microsoft提供的一个很好的示例,谢谢!将进行阅读,如果我有任何问题,请回答。:)可能适用于控制台应用程序,但在Winforms应用程序中使用此选项会使UI冻结。如果OP需要特定于平台的解决方案,他应该用平台标记此问题。@ruirodrigues1971该网站上的示例非常可怕。它实际上指示您使用
CheckForIllegalCrossThreadCalls=False
禁用线程安全检查。我不建议任何人效仿这个例子。你提供的链接似乎很旧。这与OP的问题无关,我相信他知道如何使用线程。千万不要将
CheckForIllegalCrossThreadCalls
设置为False。@HighMans:如果你开始并加入一个新的线程,你就不会有冻结UI的问题。我稍微修改了这个示例,以便在结果上实际使用
Wait
。MSDN示例比async/await更关注任务,但它们非常兼容。谢谢!我注意到,异步函数返回一个值。在示例的异步函数中,我使用了一个sub来调用另一个sub,该sub不返回任何值。我如何解释呢?我对我的示例进行了一些更新,以更好地显示我认为您正在尝试做的事情。如果您有一些线程化代码没有返回值,只需使用
Task
,如果它需要返回值,请使用
Task(返回类型)
wait
将结果显示为
dim result as integer=wait somefunction that returns taskofinger()
。延迟不是任务的成员,请您提供帮助?
Public Class Form1
    Public Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim tasks As New List(Of Task)()
        tasks.Add(Task.Run(addressof Task1))
        tasks.Add(Task.Run(addressof Task2))
        Await Task.WhenAll(tasks)

        MsgBox("Done!")
    End Sub

    Private Async Function Task1() As Task 'Takes 5 seconds to complete
        'Do some long running operating here. Task.Delay simulates the work, don't use it in your real code
        Await Task.Delay(5000)
    End Function

    Private Async Function Task2() As Task 'Takes 10 seconds to complete
        'Do some long running operating here. Task.Delay simulates the work, don't use it in your real code
        Await Task.Delay(10000)
    End Function
End Class