1

おそらくこれは単純な質問であり、答えを見つけるための正しい検索用語を知らないだけですが、私の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 イベントが実際に発生することはありません。このモーダル ダイアログを通信スレッドから開き、通信スレッドを実行し続けるにはどうすればよいですか?

前もって感謝します!

4

2 に答える 2

1

作成されたサブ内からアドレスを呼び出しています。アドレスは、このサブ外から呼び出す必要があります。

 Private Sub StartBlockingTask(ByVal reason As String)
    If Me.InvokeRequired Then
        Dim del As New BlockingDelegate(AddressOf StartBlockingTask)


   Private Sub EndBlockingTask()
        If Me.InvokeRequired Then
            Dim del As New BlockingDelegate(AddressOf EndBlockingTask)

2 つのデリゲートを作成する必要があります。StartBlockingTask 用に 1 つ、EndBlockingTask 用に 1 つ

これは MSDN の例です。

Delegate Sub MySubDelegate(ByVal x As Integer)
Protected Sub Test()
   Dim c2 As New class2()
   ' Test the delegate.
   c2.DelegateTest()
End Sub

Class class1
   Sub Sub1(ByVal x As Integer)
      MessageBox.Show("The value of x is: " & CStr(x))
   End Sub
End Class

Class class2
   Sub DelegateTest()
      Dim c1 As Class1
      Dim msd As MySubDelegate
      c1 = New Class1()
      ' Create an instance of the delegate.
      msd = AddressOf c1.Sub1
      msd.Invoke(10) ' Call the method.
   End Sub
End Class

http://msdn.microsoft.com/en-us/library/5t38cb9x(v=vs.71).aspx

これが役立つかどうか教えてください。

于 2013-06-03T16:20:24.933 に答える