1

別のスレッドで別のクラスからラベルのテキストを更新しようとしています。他のクラスは、ここで処理されるイベントを発生させます

    Private Sub handleChangeUI(ByVal sender As System.Object)
    Dim ytde As Data_Entry_Form.YTD = CType(sender, Data_Entry_Form.YTD)

    UpdateExcelLabel(ytde.LabelMessage)
End Sub

updateExcelLabel メソッドでは、ラベルのテキストを次のように変更したいと考えていました

 Private Delegate Sub updateExcelDelegate(txt As String)
Public Sub UpdateExcelLabel(text As String)
    If Me.lblExcel.InvokeRequired = True Then
        Dim del As New updateExcelDelegate(AddressOf UpdateExcelLabel)
        Me.lblExcel.BeginInvoke(del, text)
    Else
        Me.lblExcel.Visible = True
        Me.lblExcel.Text = text
        Me.lblExcel.Refresh()
    End If
End Sub

何らかの理由で Me.lblExcel.InvokeRequired は常に true を返します。デリゲートとマルチスレッドに関しては、私はまだ非常に新しいので、どんな助けも大歓迎です。

4

1 に答える 1

4

documentationに従って、コントロールが作成されたスレッドでデリゲートを実行しますBeginInvokeが、非同期であるため、次回handleChangeUI呼び出される前にデリゲートが実行を開始するという保証はありません。

Invokeではなく、常にこの状況で使用してきましBeginInvokeた。

于 2012-10-30T17:35:16.403 に答える