Control.BeginInvoke无法使用TextBox.AppendText,交叉线程

时间:2016-10-12 18:43:47

标签: vb.net multithreading begininvoke invokerequired appendtext

我想公开一种方法,用消息作为状态日志更新文本框。我想使用AppendText方法,但我在使用它时遇到了一个奇怪的多线程问题。我可以通过串联附加新邮件就好了。该问题表明它自己没有显示文本框,然后在关闭表单时显示交叉线程访问错误。以下是有效和无效的示例:

工作但不像AppendText,除非采取额外的步骤,这是最后的手段:

Public Sub AddMessage2(ByVal newMessage As String)
    If TextBoxStatus.InvokeRequired Then
        TextBoxStatus.BeginInvoke(Sub() TextBoxStatus.Text = TextBoxStatus.Text & newMessage & ControlChars.CrLf)
    Else
        TextBoxStatus.Text = TextBoxStatus.Text & newMessage & ControlChars.CrLf
    End If
End Sub

我想使用但不起作用:

Public Sub AddMessage(ByVal newMessage As String)
    If TextBoxStatus.InvokeRequired Then
        TextBoxStatus.BeginInvoke(Sub() TextBoxStatus.AppendText(newMessage))
    Else
        TextBoxStatus.AppendText(newMessage)
    End If
End Sub

其他信息和更新: 首先,我很抱歉可能没有提供足够的信息。

至少部分问题似乎是在调用AddMessage(newMessage)之前实例化表单并调用Show(),因为以下代码有效:

Public Sub AddMessage(ByVal newMessage As String)
    If Me.Created Then
        If TextBoxStatus.InvokeRequired Then
            TextBoxStatus.BeginInvoke(Sub() TextBoxStatus.AppendText(newMessage))
        Else
            TextBoxStatus.AppendText(newMessage)
        End If
    End If
End Sub

我总是会做类似以下的事情,但我想继续做些什么:)

Private backLog As String = ""
Public Sub AddMessage(ByVal newMessage As String)
    If Me.Created Then
        If TextBoxStatus.InvokeRequired Then
            TextBoxStatus.BeginInvoke(Sub() TextBoxStatus.AppendText(backLog & newMessage))
        Else
            TextBoxStatus.AppendText(backLog & newMessage)
        End If
        backLog = ""
    Else
        backLog &= newMessage
    End If
End Sub

此外,我并不认为这非常优雅...尤其是当我添加日志大小限制时

1 个答案:

答案 0 :(得分:0)

我会建议:

Public Sub AddMessage(ByVal newMessage As String)
    If TextBoxStatus.InvokeRequired Then
        TextBoxStatus.BeginInvoke(New Action(Of String)(AddressOf AddMessage), newMessage)
    Else
        TextBoxStatus.AppendText(newMessage)
    End If
End Sub