C# windows form TCP client cross thread operation недопустимая ошибка?
Привет,
Я тестирую приложение Tcp client C# windows form, которое может отправлять данные в программное обеспечение Tcp server(Hercules 3.2.8), но когда я отправляю данные с Tcp-сервера в windows form, то получаю следующую ошибку:
Система.InvalidOperationException: Кросс-потоковая операция недопустима: элемент управления 'MessageList' доступен из потока, отличного от потока, в котором он находился. в системе.Окна.Формы.ListBox.ObjectCollection.Добавить(элемент объекта )
в WindowsFormsAppication1.Form1.MessageCallBack(IAsyncResult ar) в From1.cs:строка 55
Строка 55 находится в Messagelist.items.Добавить(ответ);
public partial class Form1 : Form { Socket sck; EndPoint remoteEp; byte[] buffer; IPAddress ip = IPAddress.Parse("192.168.42.143"); int port = 8061; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { RemoteIptxt.Text = ip.ToString(); Remoteporttxt.Text = port.ToString(); //setup socket sck = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp); sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); } private void Connectbtn_Click(object sender, EventArgs e) { //binding socket remoteEp = new IPEndPoint(IPAddress.Parse(RemoteIptxt.Text), Convert.ToInt32(Remoteporttxt.Text)); sck.Connect(remoteEp); buffer = new byte[1500]; sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEp, new AsyncCallback(MessageCallBack), buffer); } private void MessageCallBack(IAsyncResult ar) { try { byte[] receiveData = new byte[1500]; receiveData = (byte[])ar.AsyncState; //Converting byte[] to string ASCIIEncoding ascencoding = new ASCIIEncoding(); string response = ascencoding.GetString(receiveData); //Adding message to listbox MessageList.Items.Add(response); buffer = new byte[1500]; sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEp, new AsyncCallback(MessageCallBack), buffer); } catch (Exception e) { MessageBox.Show(e.ToString()); } } private void buttonSend_Click(object sender, EventArgs e) { //convert string message to byte[] ASCIIEncoding ascencoding = new ASCIIEncoding(); byte[] sendmess = new byte[1500]; sendmess = ascencoding.GetBytes(textMessage.Text); sck.Send(sendmess); MessageList.Items.Add("You Said:" + textMessage.Text); textMessage.Text = ""; } } }
Что я уже пробовал:
Я новичок в программировании сокетов поэтому не знаю как создать потокобезопасную программу
Пожалуйста, помогите...!!!