繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM