也许这是一个简单的问题,我只是不知道正确的搜索词来找到答案,但是我的 Google-fu 在这个问题上让我失望了。
我的 vb.net 应用程序有一个控制所有套接字通信的后台线程。有时候,我需要这个通信线程打开一个模态窗体来显示一条消息并阻塞UI交互,直到通信线程完成一系列任务,此时通信线程会移除模态窗体,让用户继续交互。
目前,我的包含后台线程的通信类有两个事件,StartBlockingTask 和 EndBlockingTask。我的主窗体具有这些事件的事件侦听器,这些事件调用同名的子程序。他们称代码如下所示:
Private Delegate Sub BlockingDelegate(ByVal reason As String)
Private Sub StartBlockingTask(ByVal reason As String)
If Me.InvokeRequired Then
Dim del As New BlockingDelegate(AddressOf StartBlockingTask)
Me.Invoke(del, New Object() {reason})
Else
Try
_frmBlock.lblBlock.Text = reason
_frmBlock.ShowDialog()
Catch ex As Exception
'stuff
End Try
End If
End Sub
Private Sub EndBlockingTask()
If Me.InvokeRequired Then
Dim del As New BlockingDelegate(AddressOf EndBlockingTask)
Me.Invoke(del, New Object() {""})
Else
Try
If (Not _frmBlock Is Nothing) Then
_frmBlock.DialogResult = Windows.Forms.DialogResult.OK
End If
Catch ex As Exception
'stuff
End Try
End If
End Sub
这成功地阻止了 UI 的交互,但它也阻止了通信线程,因此 EndBlockingTask 事件实际上永远不会被引发。如何从通信线程打开此模式对话框并允许通信线程继续运行?
提前致谢!