也許這是一個簡單的問題,我只是不知道正確的搜索條件來找到答案,但我的Google-fu失敗了我在這一個。從後臺線程打開一個模態窗體來阻塞UI線程而不阻止後臺線程
我的vb.net應用程序有一個控制所有套接字通信的後臺線程。有時候,我需要這個通信線程來打開一個模態窗體來顯示一條消息並阻止UI交互,直到通信線程完成一系列任務之後,通信線程將移除模態窗體,從而允許用戶繼續交互。
目前,我的通信類包含後臺線程有兩個事件,StartBlockingTask和EndBlockingTask。我的主窗體具有這些事件的事件監聽器,這些事件調用了like-named subs。他們叫代碼看起來像這樣:
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
這成功地阻止從交互用戶界面,但它也能阻止通信線程,因此EndBlockingTask事件從來沒有真正得到提高。如何從通信線程打開此模式對話框並允許通信線程繼續運行?
在此先感謝!
我回到這裏重新閱讀我給出的答案,因爲重新安排了一些代碼後,被調用的方法開始再次阻塞線程。你的評論立即修復它。謝謝。我現在明白了Invoke和BeginInvoke之間的區別! – e2579382
這是一種大多數新的線程都不能實現的區別,因爲現在的計算機如此之快,以至於Invoke()調用看起來不是異步的。您的場景就是演示其差異的最佳例子! –