首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >非UI线程,UI访问

非UI线程,UI访问
EN

Stack Overflow用户
提问于 2010-11-08 16:35:41
回答 2查看 511关注 0票数 2

众所周知,您不能从UI线程以外的任何其他线程更新UI。

然而,我只是发现了一些代码,它们毫无例外地从非UI线程中获取了listview虚拟大小的值。

所以实际上我的问题是:在非UI线程中,您可以与UI进行什么交互?

谢谢你,西奥

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-08 16:38:35

因为它可以在不抛出异常的情况下工作,所以这并不意味着您应该这样做。

问题是,除了对更新UI的方法的Invoke要求之外,这些控件也不支持多线程。这意味着,当UI线程在您检索数据时更新数据时,您确实会得到损坏的数据。

票数 6
EN

Stack Overflow用户

发布于 2010-11-08 16:56:19

具体规则是不能调用使用窗口句柄的Windows API函数。使用属性或调用控件的方法是否最终会进行这样的API调用并不是很明显。MSDN文档只列出了其中4个总是可以安全使用的: InvokeRequired、Invoke()、BeginInvoke()和CreateGraphics()。

但确实,有时属性值是可用的,并且不需要API调用。Text属性就是一个很好的例子。它被缓存是因为它经常被使用。读取Text属性不会产生异常,只会得到缓存值。但是编写Text属性会变得很麻烦,更新屏幕上的文本需要API调用。ListView.VirtualSize的工作方式与此完全相同。

你没有得到例外,但它仍然不符合犹太教规。毕竟,UI线程可能也会在一微秒后更改Text属性。您将得到一个陈旧的值,这是一个典型的线程问题,称为竞争条件。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4122278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档