WPF 由于其他线程拥有此对象,因此调用线程无法对其进行访问。

一:WPF线程模型。

除非已经对WPF体系结构非常熟悉,对多线程开发很了解,不然我们在与WPF打交道的时候经常会遇到这样一个异常:

由于其他线程拥有此对象,因此调用线程无法对其进行访问。(The calling thread cannot access this object because a different thread owns it)

在WPF中,天生拥有两个线程,一个线程用于渲染UI,另一个线程是管理UI(这个我们称之为UI线程)。传说中android的动画效果为什么没有iphone的动画效果好,就是因为iphone的绘制渲染的线程的优先级非常高,只要有关于动画的操作,比如说滑动一个菜单,那么这个动画会被安排到最优先级运行,从而保证动画的流畅。这我没有深入研究,所以可能技术上来说以上描述不是十分正确,但可以按这个方式去理解。大概WPF中也是这样的理念。UI线程创建了那些在XAML或者在c#中定义的控件,并且拥有他们,并且出于对UI的保护,其他线程是不能访问到UI线程里的东西的,如果我们新建一个线程,然后在这个线程里面修改一个在xaml中或者在主线程中定义的Button.Content,那么就会得到这个异常。

在IM开发过程中,使用agsXMPP库的时候,agsXMPP有很多事件,比如XmppClientConnection.OnStateChanged事件,OnError事件等等,我们会用到很多事件处理函数,在这里必须注意一点就是,当这些事件被触发,代码被执行到事件处理函数里面的时候,执行代码的线程往往不是主线程(这里“往往”不知道用的对不对,反正我碰到的都不是在主线程中执行的),也就是说,如果这时在事件处理函数中写这样的代码:button1.content="something",就会抛出由于其他线程拥有此对象,因此调用线程无法对其进行访问异常。我们可以再visual studio中调试代码时候在看到当前执行代码的是主线程还是其他线程:如果线程一栏中没有写明是“主线程”,那么当前执行代码的线程就不是主线程。

这个时候,假如我们必须在其他线程中访问控件,怎么办?这就需要通过Dispatcher了。WPF中大多数控件都继承自DispatcherObject,也就拥有Dispatcher属性,这个Dispatatcher具体是什么东西,我就不写了,因为我也不知道,但显浅的来说,它是对他所属的线程进行工作调度的这么一个对象,或者说线程的一个管家,或者中介。你要在一个拥有某个控件的线程的外部(或者说其他线程)访问这个线程的控件,就只能通过这个控件的Dispatcher来处理了,Dispatcher有两个方法:Invoke和BeginInvoke,用来对外开放访问这个Dispatcher所属的线程所拥有的控件的机会。比如我想在其他线程中访问主线程的Button:

private void OnEventFired(object sender, MouseButtonEventArgs e)

{
btn.Dispatcher.Invoke(new Action(delegate { button1.Content = "some text"; }));
}

假设OnEventFired正被其他线程执行,代码里面通过btn.Dispatcher的Invoke方法执行一个(匿名的)函数,该函数里面是设置buttton1.content。Invoke和BeginInvoke前者是即时调用和异步调用

error:The calling thread cannot access this object because a different thread owns it解决方法相关推荐

  1. OSError: libcudart.so.8.0: cannot open shared object file: No such file or directory 解决方法

    OSError: libcudart.so.8.0: cannot open shared object file: No such file or directory 解决方法 检查cuda8是否安 ...

  2. 关于出现org.hibernate.TransientObjectException: The given object has a null identifier: 错误的解决方法

    关于出现org.hibernate.TransientObjectException: The given object has a null identifier: 错误的解决方法 参考文章: (1 ...

  3. MySQL------报错Access denied for user ‘root‘@‘localhost‘ (using password:NO)解决方法

    MySQL------报错Access denied for user 'root'@'localhost' (using password:NO)解决方法 参考文章: (1)MySQL------报 ...

  4. ERROR: Unable to access 'C:\Users\鏉庨摥\.emulator_console_auth_token': emulator consol...解决方法

    一,Android studio运行模拟器出现如下错误:Emulator: ERROR: Unable to access 'C:\Users\鏉庨摥.emulator_console_auth_to ...

  5. VS2005+ACCESS WEB程序出错数据访问权限错误的解决方法

    最近使用VS2005+ACCESS写了一个网站管理系统,上传到服务器上后,在删除数据和新增加数据时总是出错,在本地调试又没有问题.经过检查,原来是服务器的数据库文件没有修改权限,修改数据库文件的访问权 ...

  6. mysql报错ERROR 1206 (HY000): The total number of locks exceeds the lock table size的解决方法...

    1. 问题背景         InnoDB是新版MySQL(v5.5及以后)默认的存储引擎,之前版本的默认引擎为MyISAM,因此,低于5.5版本的mysql配置文件.my.cnf中,关于InnoD ...

  7. Git 报错 error: pathspec ‘XXX‘ did not match any file(s) known to git 报错解决方法

    问题复现 : ① 在本地分支切换到同事新创建的分支: git checkout xxx ② 报错: error: pathspec 'XXX' did not match any file(s) kn ...

  8. ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)的解决方法

    想要启动mysql,但是在cmd中直接输入mysql -u root -p时出现了如下问题: C:\Users\lic>mysql -u root -p Enter password: **** ...

  9. Spyder 运行出现 Reloaded modules: **AttributeError: 'NoneType' object has no attribute 'modules' 错误的解决方法

    问题描述: 刚开始学习python,有很多问题不懂,网上找了很久找不到答案,就把这个问题记下来,希望可以帮助到其他初学者 使用spyder运行以下代码: 第一次运行可以正常显示结果,第二次运行时报错: ...

最新文章

  1. 走向国际,人民邮电出版社图灵公司携 10 本原创图书亮相首届云上 BIBF
  2. 二叉树的链式存储结构--二叉链表
  3. 程序员面试题精选100题(44)-数值的整数次方[算法]
  4. 初次联系导师短信模板_2020考研复试:提前联系导师的6点注意事项(附邮件模板)...
  5. 百度网盘php文件怎么打开,如何通过网页版百度网盘下载大文件
  6. VirtualBox虚拟机配置CentOS7网络图文详解教程
  7. python无法在终端运行程序_解决项目pycharm能运行,在终端却无法运行的问题
  8. python 多线程 线程池的四种实现方式
  9. 如何查询手机当前基站编号信息
  10. 二、AFD-Net: Aggregated Feature Difference Learning for Cross-Spectral Image Patch Matching论文阅读
  11. opencv学习(十四)之图像颜色通道分离和融合
  12. 硫化仪硫化反应诱导、交联反应和网状结构形成
  13. 年轻人要对自己狠一点
  14. QT 大作业实现对图片与视频的处理
  15. 1、Neural Rendering
  16. java将汉字转成拼音首字母大写字母_java实现将汉字转为首字母、拼音
  17. hashcat破解wifi密码(kali)
  18. shader基础学习摘要(二) 兰伯特光照模型
  19. 阿里招linux程序员吗,2015-8-29阿里校园招聘研发工程师笔试题(另一篇)
  20. (四)【软件设计师】计算机系统—基础单位进制

热门文章

  1. 如何对word中不同页面设置不同页眉页脚
  2. 【Windows7库功能使用技巧 】
  3. DevpTips【golang】安装到测试
  4. APP爬虫之央视新闻
  5. -bash:/etc/profile: line 21: syntax error near unexpected token `$‘do\r‘‘
  6. Python强化知识之获取网络资源 Urllib(一)
  7. Java中instanceof关键字的用法
  8. python之简单的文件处理
  9. CCNA WAN 帧中继
  10. 没有躲过的坑--C++函数的默认参数(重新定义默认参数)