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

来源:互联网 发布:xmind软件下载 编辑:程序博客网 时间:2024/05/07 16:06

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

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


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

       解决如下:

       添加一个 AddStringToListBox  函数:

private delegate void AddStringToListBoxDelegate(string str);        /// <summary>        /// 在ListBox中追加状态信息        /// </summary>        /// <param name="str">要追加的信息</param>        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));



原创粉丝点击