这是一个本地聊天应用程序,我的问题是,当我在同一台PC上运行两个应用程序实例时,但是当我想在两台PC之间聊天时,我在下面的图片中看到了这个错误1 。我知道这是一个线程问题,这个代码必须改变,所以任何人都可以帮忙吗?
private void MessageCallBack(IAsyncResult aResult)
{
try
{
byte[] recieveData = new byte[1500];
recieveData = (byte[])aResult.AsyncState;
ASCIIEncoding aEncoding = new ASCIIEncoding();
string recievedMessage = aEncoding.GetString(recieveData);
listMessage.Items.Add("Friend: " + recievedMessage);
buffer = new byte[1500];
sok.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
答案 0 :(得分:3)
ListMessage是您在UI线程上创建的项目。您无法从其他线程更新它。我会使用dispatcher.begininvoke方法。
Dispatcher.BeginInvoke((Action)(() =>
{
ListMessage.Items.Add(string.Format("Friend: {0}", recievedMessage))
}));
请参阅MSDN
答案 1 :(得分:0)
您从中获取的数据来自另一个非UIThread,这就是您获得此Exception
的原因,并且您无法更改UI控件。
解决方案:您可以使用InvokeRequired
来自MSDN
获取一个值,该值指示调用者在进行制作时是否必须调用invoke方法 方法调用控件,因为调用者是 在与创建控件的线程不同的线程上。
替换它:
listMessage.Items.Add("Friend: " + recievedMessage);
用这个:
if(this.listMessage.InvokeRequired)
{
Invoke((MethodInvoker)(() => {
listMessage.Items.Add("Friend: " + recievedMessage);
});
}