Vb.net 线程安全隐藏形式

Vb.net 线程安全隐藏形式,vb.net,multithreading,winforms,thread-safety,show-hide,Vb.net,Multithreading,Winforms,Thread Safety,Show Hide,我正在尝试使用BackgroundWorker(netMessageInWait)在DLL中创建一个“加载…”表单,其中包含一个简单的动画 我有一个Show函数,可以加载表单、设置所有文本并运行BackgroundWorker Public Sub Show(ByVal WorkingArea As Rectangle, ByVal Title As String, ByVal Message As String) With wait If (wait.InvokeRe

我正在尝试使用BackgroundWorker(netMessageInWait)在DLL中创建一个“加载…”表单,其中包含一个简单的动画

我有一个Show函数,可以加载表单、设置所有文本并运行BackgroundWorker

Public Sub Show(ByVal WorkingArea As Rectangle, ByVal Title As String, ByVal Message As String)
     With wait
        If (wait.InvokeRequired) Then
            wait.Invoke(Sub()
                            With .lblTitle
                                .Text = Title
                            End With
                            With .lblMessage
                                .Text = Message
                            End With
                        End Sub)
        Else
            With .lblTitle
                .Text = Title
            End With
            With .lblMessage
                .Text = Message
            End With
        End If
    End With

    If (Not backWorker.IsBusy) Then
        Dim args As New ShowArgumentType
        args.WorkingArea = WorkingArea
        args.Title = Title
        args.Message = Message

        backWorker.WorkerSupportsCancellation = True
        backWorker.RunWorkerAsync(args)
    End If    
End Sub
Public Sub ClearMessage()
    Try
        CancelWork = True
        backWorker.CancelAsync()

    Catch ex As Exception
        Debug.Print(ex.Message)
    End Try
End Sub
以及停止后台工作人员的清除功能

Public Sub Show(ByVal WorkingArea As Rectangle, ByVal Title As String, ByVal Message As String)
     With wait
        If (wait.InvokeRequired) Then
            wait.Invoke(Sub()
                            With .lblTitle
                                .Text = Title
                            End With
                            With .lblMessage
                                .Text = Message
                            End With
                        End Sub)
        Else
            With .lblTitle
                .Text = Title
            End With
            With .lblMessage
                .Text = Message
            End With
        End If
    End With

    If (Not backWorker.IsBusy) Then
        Dim args As New ShowArgumentType
        args.WorkingArea = WorkingArea
        args.Title = Title
        args.Message = Message

        backWorker.WorkerSupportsCancellation = True
        backWorker.RunWorkerAsync(args)
    End If    
End Sub
Public Sub ClearMessage()
    Try
        CancelWork = True
        backWorker.CancelAsync()

    Catch ex As Exception
        Debug.Print(ex.Message)
    End Try
End Sub
BackgroundWorker\u DoWork()以财务方式显示表单并等待ClearMessage

Private Sub backWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backWorker.DoWork
    Dim args As ShowArgumentType = DirectCast(e.Argument, ShowArgumentType)

    wait.Show()

    While True
        Application.DoEvents()
        If (CancelWork Or backWorker.CancellationPending) Then
            Exit While
        End If
    End While

End Sub
然后是隐藏表单的BackgroundWorker\u RunWorkerCompleted()

Private Sub backWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles backWorker.RunWorkerCompleted
    CancelWork = False

    Call ShowHideForm_ThreadSafe(wait, False) ' HERE THE PROBLEM

    Debug.Print("Work completed")
End Sub
好的…我不明白的是为什么我在开始的时候试图用freez程序下面的函数隐藏表单

Private Sub ShowHideForm_ThreadSafe(ByVal pform As Form, _
                                    ByVal pshow As Boolean)
    If pform.InvokeRequired Then
        Dim MyDelegate As New ShowHideForm_Delegate(AddressOf ShowHideForm_ThreadSafe)



        pform.BeginInvoke(MyDelegate, New Object() {[pform], [pshow]})


    Else
        If (pshow) Then
            pform.Show()
        Else
            pform.Hide()
        End If
    End If

End Sub
请帮帮我!我如何解决这个问题?
谢谢

这是长期错误的做法。BGW线程非常不适合显示UI。让BGW线程执行UI线程现在正在执行的任何操作,并让UI线程可用于显示表单。在调用RunWorkerAsync()之前显示表单。隐藏或关闭进度表单现在对于RunWorkerCompleted事件处理程序来说变得微不足道。@HansPassant那么如何在单独的线程中显示/隐藏windows表单呢?