多线程BUG捕捉之:由于其他线程拥有此对象,因此调用线程无法对其进行访问
2010-03-16 18:09
886 查看
以下论述只适用于WPF和WCF场合。
在进行WCF通信的时候,有时候会出现“由于其他线程拥有此对象,因此调用线程无法对其进行访问”。如下面的这段代码就可能会出现这个错误:
EndpointAddress tcpAddress = new EndpointAddress(new Uri(_wcfServiceUri), identity, headers);
_duplexChannelFactory = new DuplexChannelFactory<IStudentPcService>(
new InstanceContext(new CallStudentPcBack()), tcpBinding, tcpAddress);
经过调试发现,_wcfServiceUri出现了问题。经查,如果此处直接指定地址,无问题,可是换成了_wcfServiceUri这个变量就有问题了。追溯到_wcfServiceUri这个变量,发现该变量为了让WPF页面可以动态更新,为一个DependencyProperty,即:
public static readonly DependencyProperty StudentIpProperty =
DependencyProperty.Register("StudentIp", typeof(string),
typeof(StudentInfo), new UIPropertyMetadata(null));
public string StudentPcIp
{
get { return (string)GetValue(StudentIpProperty); }
set { SetValue(StudentIpProperty, value); }
}
于是问题找到了,因为_wcfServiceUri也就是StudentPcIp,是DependencyProperty,也就是说,拥有它的线程是WPF即主UI线程,而WCF的通信操作在我的程序里是在一个线程池中,所以报错。将变量替换之,问题解决。
在进行WCF通信的时候,有时候会出现“由于其他线程拥有此对象,因此调用线程无法对其进行访问”。如下面的这段代码就可能会出现这个错误:
EndpointAddress tcpAddress = new EndpointAddress(new Uri(_wcfServiceUri), identity, headers);
_duplexChannelFactory = new DuplexChannelFactory<IStudentPcService>(
new InstanceContext(new CallStudentPcBack()), tcpBinding, tcpAddress);
经过调试发现,_wcfServiceUri出现了问题。经查,如果此处直接指定地址,无问题,可是换成了_wcfServiceUri这个变量就有问题了。追溯到_wcfServiceUri这个变量,发现该变量为了让WPF页面可以动态更新,为一个DependencyProperty,即:
public static readonly DependencyProperty StudentIpProperty =
DependencyProperty.Register("StudentIp", typeof(string),
typeof(StudentInfo), new UIPropertyMetadata(null));
public string StudentPcIp
{
get { return (string)GetValue(StudentIpProperty); }
set { SetValue(StudentIpProperty, value); }
}
于是问题找到了,因为_wcfServiceUri也就是StudentPcIp,是DependencyProperty,也就是说,拥有它的线程是WPF即主UI线程,而WCF的通信操作在我的程序里是在一个线程池中,所以报错。将变量替换之,问题解决。
相关文章推荐
- 【黑马程序员】关于多线程聊天室中出现的“由于其他线程拥有此对象,因此调用线程无法对其进行访问”问题的探究
- wpf-由于其他线程拥有此对象,因此调用线程无法对其进行访问。
- WPF 由于其他线程拥有此对象,因此调用线程无法对其进行访问
- WPF 调用线程无法访问此对象,因为另一个线程拥有该对象
- WPF调用线程 解决“调用线程无法访问此对象,因为另一个线程拥有该对象“问题
- WPF 调用线程无法访问此对象,因为另一个线程拥有该对象
- 关于PrintQueueCollection()类,跨线程调用错误“线程无法访问此对象,因为另一个线程拥有该对象”
- 用了invoke还是出错的解决方法.wpf 调用线程无法访问此对象,因为另一个线程拥有该对象。
- WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变
- WPF异常:调用线程无法访问此对象,因为另一个线程拥有该对象。
- WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案
- 调用线程无法访问此对象,因为另一个线程拥有该对象
- WPF 调用线程无法访问此对象,因为另一个线程拥有该对象
- 调用线程无法访问此对象,因为另一个线程拥有该对象
- WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变
- C#技巧【调用线程无法访问此对象,因为另一个线程拥有该对象的问题的解决办法】【C#读写EXCEL源码提示“office检测到此文件存在一个问题。为帮助保护您的计算机,不能打开此文件”的解决】
- 调用线程无法访问此对象,因为另一个线程拥有该对象 [c# wpf定时器程序报的错误]
- 调用线程无法访问此对象,因为另一个线程拥有该对象
- wpf调用线程无法访问此对象,因为另一个线程拥有该对象
- WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变