おそらくこれは単純な質問であり、答えを見つけるための正しい検索用語を知らないだけですが、私のGoogle-fuはこれで失敗しました.
私の vb.net アプリケーションには、すべてのソケット通信を制御するバックグラウンド スレッドがあります。場合によっては、この通信スレッドがモーダル フォームを開いてメッセージを表示し、通信スレッドが一連のタスクを完了するまで UI インタラクションをブロックする必要があります。この時点で、通信スレッドはモーダル フォームを削除し、ユーザーがインタラクションを続行できるようにします。
現在、バックグラウンド スレッドを含む通信クラスには、StartBlockingTask と EndBlockingTask の 2 つのイベントがあります。私のメイン フォームには、同様の名前のサブルーチンを呼び出すこれらのイベントのイベント リスナーがあります。次のようなコードを呼び出します。
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 イベントが実際に発生することはありません。このモーダル ダイアログを通信スレッドから開き、通信スレッドを実行し続けるにはどうすればよいですか?
前もって感謝します!