0

我想公开一种方法来更新带有消息的文本框作为状态日志。我想使用 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

另外我认为这不是很优雅......尤其是当我添加日志大小限制时

4

1 回答 1

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
于 2016-10-12T23:05:51.533 回答