多线程BUG捕捉之:由于其他线程拥有此对象,因此调用线程无法对其进行访问

30 篇文章 1 订阅
13 篇文章 0 订阅

      以下论述只适用于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的通信操作在我的程序里是在一个线程池中,所以报错。将变量替换之,问题解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值