如何从C#中的另一台PC访问列表框

时间:2013-11-23 06:57:01

标签: 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());
        }
    }

2 个答案:

答案 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);
        });
         }