我尝试使用以下代码访问另一个表单上的富文本框:
Private Delegate Sub StringDelegateChat(text As String, window As ChatWindow)
Private Sub AppendTextChatWindows(text As String, window As ChatWindow)
Try
If window.RichTextBox1.InvokeRequired Then
window.Invoke(New StringDelegateChat(AddressOf AppendTextChatWindows), text, window)
Else
window.RichTextBox1.AppendText(text)
window.RichTextBox1.SelectionStart = window.RichTextBox1.Text.Length
window.RichTextBox1.ScrollToCaret()
End If
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
但是我得到了交叉线程操作无效错误,我认为这样做是因为它错过了if语句的window.invoke
部分。我也尝试将If window.RichTextBox1.InvokeRequired Then
替换为If InvokeRequired Then
,但它会在一个继续循环中被捕获并引发堆栈溢出错误。
由于 Houlahan
答案 0 :(得分:6)
我相信,在第5行,window.Invoke
应更改为window.RichTextBox1.Invoke
。
Private Delegate Sub StringDelegateChat(text As String, window As ChatWindow)
Private Sub AppendTextChatWindows(text As String, window As ChatWindow)
Try
If window.RichTextBox1.InvokeRequired Then
window.RichTextBox1.Invoke(New StringDelegateChat(AddressOf AppendTextChatWindows), text, window)
Else
window.RichTextBox1.AppendText(text)
window.RichTextBox1.SelectionStart = window.RichTextBox1.Text.Length
window.RichTextBox1.ScrollToCaret()
End If
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
答案 1 :(得分:3)
你试过了吗?
Private Sub AppendTextChatWindows(text As String, window As ChatWindow)
Try
If window.RichTextBox1.InvokeRequired Then
window.RichTextBox1.BeginInvoke(New StringDelegateChat(AddressOf AppendTextChatWindows), text, window)
Exit Sub
Else
window.RichTextBox1.AppendText(text)
window.RichTextBox1.SelectionStart = window.RichTextBox1.Text.Length
window.RichTextBox1.ScrollToCaret()
End If
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
End Sub
基本上,我问的是BeginInvoke而不是Invoke。虽然我希望,正如另一张海报所提到的,你应该使用同样的东西,你检查所需的反对调用。 (即window.invokeRequired& window.BeginInvoke或控件)
答案 2 :(得分:0)
我无法在您的代码中看到任何错误。您可能想要检查更新RichTextbox时触发的任何事件。它们可能会导致交叉线程。
作为解决问题的方法,使用对象时,您遇到交叉线程问题的可能性较小。