2011-10-12 32 views
5

im cố gắng để truy cập vào một textbox giàu trên một hình thức im sử dụng đoạn mã sau để làm như vậy:chéo hoạt động chủ đề không hợp lệ

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 

nhưng tôi nhận được hoạt động chủ đề xuyên báo lỗi không hợp lệ, tôi nghĩ rằng nó thực hiện điều này bởi vì nó bỏ lỡ phần window.invoke của câu lệnh if. tôi cũng đã thử thay thế If window.RichTextBox1.InvokeRequired Then thành If InvokeRequired Then nhưng nó bị bắt trong vòng lặp tiếp tục và lỗi tràn ngăn xếp được ném.

Cảm ơn Houlahan

+0

Đã cố gắng đã được window.InvokeRequired thay vì window.RichTextBox1.InvokeRequired? –

+0

yea mà chỉ cần bỏ qua cho người khác và sau đó trows ngoại lệ:/ – Houlahan

+0

Bạn có chắc chắn rằng các điều khiển xử lý đã được tạo ra? Ngay cả khi bạn đang có, nó có thể không làm tổn thương để kiểm tra ... – jmoreno

Trả lời

6

Tôi tin rằng, trên dòng 5, window.Invoke nên được thay đổi để 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 
0

Tôi không thể thấy bất kỳ lỗi nào trong mã của bạn. Bạn có thể muốn kiểm tra bất kỳ sự kiện nào được kích hoạt khi cập nhật RichTextbox. Họ có thể gây ra một luồng chéo.

Như một giải pháp cho vấn đề của bạn, làm việc với các đối tượng, bạn ít có khả năng gặp phải vấn đề về luồng chéo.

3

Các bạn đã thử:

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 

Về cơ bản, tôi đang hỏi về BeginInvoke hơn là Invoke. Mặc dù tôi mong đợi, như một áp phích khác được đề cập, rằng bạn nên sử dụng cùng một điều bạn kiểm tra yêu cầu chống lại để gọi. (tức là cả window.invokeRequired & window.BeginInvoke hoặc điều khiển)

Các vấn đề liên quan