2

別のスレッドから動的に生成されたコントロールにアクセスしようとしています。しかし、コードで常に「スタックオーバーフロー例外」が発生します。

私は次のコードを使用しています:

Private _workerThread As Threading.Thread

Private Sub Main_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    Dim Label As New Label
    Label.Name = "Label1"
    Label.Location = New System.Drawing.Point(12, 12)
    Label.Text = String.Empty
    Label.AutoSize = True

    Controls.Add(Label)

    _workerThread = New Threading.Thread(AddressOf DoWork)
    _workerThread.Priority = Threading.ThreadPriority.BelowNormal
    _workerThread.Start()
End Sub

Private Sub DoWork()
    SetLabelText("Label1", "text")
End Sub

Delegate Sub SetLabelTextCallback(ByVal LabelName As String, ByVal text As String)
Private Sub SetLabelText(ByVal LabelName As String, ByVal text As String)
    If CType(Me.Controls(LabelName), Label).InvokeRequired Then
        Dim d As New SetLabelTextCallback(AddressOf SetLabelText)
        d.Invoke(LabelName, text)
    Else
        CType(Me.Controls(LabelName), Label).Text = text
    End If
End Sub

どうやらInvokeRequiredがFalseになることはありません。しかし、なぜそれを理解することはできません。たぶん誰かが私が間違っていることを教えてくれるでしょう。

4

1 に答える 1

3

LabelのスレッドでメソッドSetLabelTextCallbackを呼び出していないため
、同じスレッドで再度呼び出すことになり、InvokeRequiredがfalseになることはありません。

Delegate Sub SetLabelTextCallback(ByVal LabelName As String, ByVal text As String) 

Private Sub SetLabelText(ByVal LabelName As String, ByVal text As String) 
    Dim l as Label = CType(Me.Controls(LabelName), Label)
    if l.InvokeRequired then
        Dim d As New SetLabelTextCallback(AddressOf SetLabelText) 
        l.Invoke(d, new Object() {LabelName, text} ) 
    Else 
        l.Text = text 
    End If 
End Sub 
于 2012-06-02T20:17:50.763 に答える