0

この質問は2つの部分に分かれています。私はマルチスレッドに慣れていないので、最初にロジックが正しいかどうかを確認してから、マルチスレッドでエラーを処理する方法を見つけたいと思います。Q1:2つのデータテーブルから情報を取得するSQLデータベースを呼び出すアプリケーションがあります。この情報は、最終的な表示に結合されます。マルチスレッドを使用せずに、各SQL selectを呼び出して、データセットに次々にデータを入力します。マルチスレッドでは、最初に複雑な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は、ThreadLoad_Longer_Dataが実行を終了するまで、呼び出し元のスレッド(Joinを呼び出すコードを実行するスレッド)の実行を停止します。

ThreadLoad_Longer_Data内に未処理のexeceptionがある場合、結果はスレッドの終了であり、したがって呼び出し元のスレッドの実行が再開されます。

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 に答える