[英]How can i access a listbox from another pc in C#
这是一个本地聊天应用程序,我的问题是,当我运行在同一台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());
}
}
ListMessage是您在UI线程上创建的项目。 您不能从另一个线程更新它。 我将使用dispatcher.begininvoke方法。
Dispatcher.BeginInvoke((Action)(() =>
{
ListMessage.Items.Add(string.Format("Friend: {0}", recievedMessage))
}));
参见MSDN
您从中获取的数据来自另一个非UIThread,这就是您获取此Exception
且无法更改UI控件的原因。
解决方案:您可以使用InvokeRequired
从MSDN
获取一个值,该值指示在进行调用时调用者是否必须调用invoke方法
方法调用该控件,因为调用方与创建控件的线程不在同一线程上。
替换为:
listMessage.Items.Add("Friend: " + recievedMessage);
有了这个:
if(this.listMessage.InvokeRequired)
{
Invoke((MethodInvoker)(() => {
listMessage.Items.Add("Friend: " + recievedMessage);
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.