在调试中,出现这个错误的原因,我在网上查了很多。大体上总结一下是: 两个或多个线程操作一个控件所引起的问题。
在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));
在WPF应用中,由于线程同步问题,可能会遇到'调用线程无法访问此对象,因为另一个线程拥有该对象'的错误。解决方法通常涉及使用委托来更新UI。此外,当函数求值超时导致禁用后,需要特定的处理以重新启用函数求值。通过调整代码并参考他人解决方案,可以成功解决这类问题。
1万+

被折叠的 条评论
为什么被折叠?



