Vb.net 线程安全隐藏形式
我正在尝试使用BackgroundWorker(netMessageInWait)在DLL中创建一个“加载…”表单,其中包含一个简单的动画 我有一个Show函数,可以加载表单、设置所有文本并运行BackgroundWorkerVb.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
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表单呢?