我想公开一种方法来更新带有消息的文本框作为状态日志。我想使用 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
另外我认为这不是很优雅......尤其是当我添加日志大小限制时