WPF中调用线程无法访问此对象,因为另一个线程拥有该对象 的解决方法

         在调试中,出现这个错误的原因,我在网上查了很多。大体上总结一下是:   两个或多个线程操作一个控件所引起的问题。

         在WPF中,UI分创建线程和访问线程。所以需要用委托机制来解决。


如果要在另一个线程中修改控件的Text属性(例如:ListBox控件类型的 lbConnected),如果直接写:lbStatus.Items.Add(str);    的话就会出现上述错误。  

       解决如下:

       添加一个 AddStringToListBox  函数:

private delegate void AddStringToListBoxDelegate(string str);
        /// 
        /// 在ListBox中追加状态信息
        /// 
        /// 要追加的信息
        private void AddStringToListBox(string str)
        {
            if (!lbStatus.Dispatcher.CheckAccess())
            {
                AddStringToListBoxDelegate d = AddStringToListBox;
                lbStatus.Dispatcher.Invoke(d, str);
            }
            else
            {
                lbStatus.Items.Add(str);
            }
        }

然后把刚才的  lbStatus.Items.Add(str);  修改为  

AddStringToListBox(string.Format("开始在:{0}:{1}监听客户连接",txtServerIP.Text, port));
       里面的参数不用管他,是我的项目里的内容,你可以换成你自己的参数。

但是现在还是出了个问题,提示参数里面的  txtServerIP.Text   的错误信息  “由于以前的函数求值超时 函数求值被禁用。必须继续执行才能重新启用函数求值。”,我想了想,还是同样的原因,因为  txtServerIP  与 ListBox 是一个性质的,所以我在网上查了一下,这位的文章帮我解决了这个问题 点击打开链接

       我按照他的方法,把代码做了一些修改,当然 AddStringToListBox 的方法不需要改,只是在调用的地方做一下修改,具体如下:

txtServerIP.Dispatcher.Invoke(
                    new Action(
                        delegate
                        {
                            AddStringToListBox(string.Format("开始在:{0}:{1}监听客户连接", txtServerIP.Text, port));
                        }
                        )
                    );
                //AddStringToListBox(string.Format("开始在:{0}:{1}监听客户连接",txtServerIP.Text, port));



你可能感兴趣的:(解决方案)