跨线程操作无效

时间:2011-10-12 16:55:57

标签: vb.net multithreading

我尝试使用以下代码访问另一个表单上的富文本框:

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

3 个答案:

答案 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时触发的任何事件。它们可能会导致交叉线程。

作为解决问题的方法,使用对象时,您遇到交叉线程问题的可能性较小。