2

VB.Net アプリケーションで奇妙なハングの問題が発生しています。ユーザーが更新ボタンをクリックすると、以下がスレッドとして実行され、データに対して長い計算が行われます。コントロールを無効にし、「作業中...」テキスト ボックスを表示し、作業を行い、コントロールを再度有効にして、「作業中...」テキスト ボックスを取り除きます。ときどき (デバッグ中に再現したことはありません)、ユーザー ウィンドウがフリーズしてハングします。CPU 使用率が 0 になると、計算は完了しますが、ウィンドウが完全にスタックして更新されませんが、コントロールは無効として表示され、[作業中...] テキスト ボックスは表示されたままになります。これは無期限にこのままになります (ユーザーは 30 分まで待機しようとしました)。奇妙なことに、私は「剥がす」ことができます タスクバーのウィンドウの右クリックメニューから最小化/復元ボタンをクリックするだけで、ウィンドウを復元できます。しばらくすると、ウィンドウが元に戻ります。ウィンドウ自体の最小化/復元は効果がないようです。

私の質問ですが、以下のスレッドで何が間違っていますか?

Dim Thread As New Threading.Thread(AddressOf SubDoPriceUpdateThread)
Thread.Start()

スレッド:

    Private Sub SubDoPriceUpdateThread()

            Dim Loading As New TextBox
            Try
                CntQuotePriceSummary1.Invoke(New Action(Of Control)(AddressOf CntQuotePriceSummary1.Controls.Add), Loading)
                CntQuotePriceSummary1.Invoke(New Action(Sub() CntQuotePriceSummary1.Enabled = False))

                Loading.Invoke(New Action(AddressOf Loading.BringToFront))
                Loading.Invoke(New Action(Sub() Loading.Text = "Working..."))

                '***Long running calculations***

                Invoke(New Action(AddressOf FillForm))

            Finally
                CntQuotePriceSummary1.Invoke(New Action(Of Control)(AddressOf CntQuotePriceSummary1.Controls.Remove), Loading)
                CntQuotePriceSummary1.Invoke(New Action(Sub() CntQuotePriceSummary1.Enabled = True))
                Loading.Invoke(New Action(AddressOf Loading.Dispose))
            End Try

    End Sub
4

1 に答える 1

0

Hans のコメントによると、Loadingテキスト ボックスが UI スレッドで作成されていないことは明らかであり、それがデッドロックの問題の原因でした。コードを書き直しました。

     Private Sub SubDoPriceUpdateThread()

            Dim Loading As TextBox
            Invoke(Sub() Loading = New TextBox)

            Try
               Invoke(Sub()
                           CntQuotePriceSummary1.Controls.Add(Loading)
                           CntQuotePriceSummary1.Enabled = False
                           Loading.BringToFront()
                           Loading.Text = "Working..."
                       End Sub)

               '***Long running calculations***

                Invoke(Sub() FillForm())

            Finally
                Invoke(Sub()
                           CntQuotePriceSummary1.Controls.Remove(Loading)
                           CntQuotePriceSummary1.Enabled = True
                           Loading.Hide()
                           Loading.Dispose()
                       End Sub)
            End Try

    End Sub
于 2013-01-18T20:35:14.390 に答える