0

这个问题有 2 个部分。我是多线程的新手,所以我想首先检查我的逻辑是否正确,然后我想了解如何处理多线程中的错误。Q1:我有一个应用程序调用 SQL 数据库从 2 个数据表中获取信息,然后将这些信息组合在最终显示中。在没有多线程的情况下,我调用每个 SQL 选择一个接一个地填充数据集。对于多线程,我首先将更复杂的 SQL 作为单独的线程调用,然后在主线程中调用不太复杂的 SQL。我试图通过同时执行它们来减少两者的加载时间。(我意识到严格来说我应该作为后台任务来释放 UI,对我来说首先是小步骤)无论如何代码看起来有点像这样

 Dim ThreadLoad_Longer_Data As Thread
    ThreadLoad_Longer_Data = New Thread(AddressOf Me.Fill_LongerSQL)

        ThreadLoad_Longer_Data.IsBackground = True
        TThreadLoad_Longer_Data.Start()

   'Execute some code here for the second SQL call in main thread

   'Then stop the main prosess to wait for the finish of the of the background
        ThreadLoad_Longer_Data.join

我假设 .Join 语句实际上会停止主线程并等待另一个完成?这个对吗 ?如果是这样,它把我带到了第二部分。Q2。如果第一个线程完成会发生什么?喜欢通过错误?我该如何处理这种情况?

谢谢

4

1 回答 1

2

是的,调用ThreadLoad_Longer_Data.Join将停止调用线程(执行调用 Join 的代码的线程)的执行,直到 ThreadLoad_Longer_Data 结束其执行。

如果在 ThreadLoad_Longer_Data 内部有一个未处理的异常,则结果是线程的结束,因此调用线程的执行恢复。

Sub Main
    Try
        Console.WriteLine("Start of the main thread")
        Dim ThreadLoad_Longer_Data As Thread 
        ThreadLoad_Longer_Data = New Thread(AddressOf Me.Fill_LongerSQL) 
        ThreadLoad_Longer_Data.IsBackground = True 
        ThreadLoad_Longer_Data.Start() 
        ThreadLoad_Longer_Data.Join
        Console.WriteLine("End of the main thread")
    Catch x as Exception
      Console.WriteLine(x.Message)
    End Try
End Sub

Sub Fill_LongerSQL()
    Console.WriteLine("Before the exception")
    dim y as integer
    for x = 0 to 1000000000
        y = y + 1
    next
    Throw new Exception("This is an unhandled exception")
    ' this will never executed
    Console.WriteLine("After the exception")
End Sub
于 2012-09-21T12:14:26.663 回答