2010-02-12 37 views
6

Tôi tiếp tục gặp lỗi sau khi gỡ lỗi.Thao tác chéo không hợp lệ

Cross-thread operation not valid: Control 'richTextBoxReceivedMsg' accessed from a thread other than the thread it was created on. 

Dưới đây là đoạn code mà nó trỏ tới:

public void OnDataReceived(IAsyncResult asyn) 
{ 
    try 
{ 
    SocketPacket socketData = (SocketPacket)asyn.AsyncState; 

    int iRx = 0; 

     // Complete the BeginReceive() asynchronous call by EndReceive() method 
     // which will return the number of characters written to the stream by the client 
     iRx = socketData.m_currentSocket.EndReceive (asyn); 

     char[] chars = new char[iRx + 1]; 
     System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); 
     int charLen = d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0); 
     System.String szData = new System.String(chars); 
     richTextBoxReceivedMsg.AppendText(szData); 

     // Continue the waiting for data on the Socket 
     WaitForData(socketData.m_currentSocket); 
    } 
    catch (ObjectDisposedException) 
    { 
     System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n"); 
    } 
    catch (SocketException se) 
    { 
     MessageBox.Show(se.Message); 
    } 
} 

ai đó có thể vui lòng giúp tôi sửa lỗi này?

+0

Đừng bao giờ sửa lỗi này bằng cách đặt CheckForIllegalCrossThreadCalls thành sai. Nó chỉ giả vờ là không có vấn đề thay vì thực sự sửa chữa nó ... – user2141066

Trả lời

21

Bạn cần phải thay thế này:

richTextBoxReceivedMsg.AppendText(szData); 

với một cái gì đó giống như

Invoke(new Action(() => richTextBoxReceivedMsg.AppendText(szData))); 

Lý do là Windows Forms là không thực sự được thiết kế để làm việc trên chủ đề khác nhau. Phương pháp Invoke sẽ chạy ủy nhiệm bạn chuyển cho nó trong chuỗi giao diện người dùng. Nếu bạn muốn thao tác các phần tử giao diện người dùng thông qua các luồng khác, bạn sẽ phải chạy thao tác thực tế trên luồng giao diện người dùng. InvokeRequired tài sản sẽ cho bạn biết khi nào bạn cần sử dụng Invoke thay vì gọi trực tiếp phương thức.

+1

Cảm ơn bạn, Mehrdad. :) - ... Nó hiển thị thông báo cho biết "Không thể chuyển đổi phương thức nặc danh thành 'System.Delegate' vì nó không phải là đại biểu." –

+0

@ j-t-s: Tôi luôn hiểu sai và quên đối số để gọi là 'System.Delegate'. Điều này sẽ khắc phục nó. –

2

Xem bài viết của Jon Skeet về đa luồng, đặc biệt là trang trên multi-threading winforms. Nó sẽ sửa chữa bạn ngay lập tức.

+1

Cảm ơn bạn rất nhiều, @magnifico. Rất thú vị đọc! –

0

This liên kết có thể giúp bạn.

+1

Cảm ơn bạn Otavio, nhìn vào nó ngay bây giờ :) –

-1

kiểm tra bằng cách viết câu lệnh đã cho trong hàm tạo Form1() của bạn RichTextBox.CheckForIllegalCrossThreadCalls = false;

Cảm ơn u ....

+0

Điều này đang hoạt động. –

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