c# - 为什么操作 UI 控件需要在创建它的线程内完成?

标签 c# android .net user-interface controls

我一直在使用 C# .NET 和 Android 开发许多软件。我注意到这两个系统在 Thread 和 UI control(Label/TextView 等)上具有相同的行为。为此,我认为防止线程外更改的设计不仅仅是巧合。

人们遇到的最普遍的问题是它们不能在创建它们的线程之外更改(例如,Text 属性)。我们必须在 C# 中使用 Invoke,或者在 Android 中使用 Handler

我的问题是,为什么控件必须实现此类行为?如果我可以在创建它们的线程之外更改它们的属性/字段,可能会发生什么坏事?

编辑:感谢Raghunandanless 的引用。我已经知道其中的一部分,我对这个问题的主要关注是,为什么线程池中的线程没有在您的 UI 线程上运行无法访问控件的属性/字段? Android 的 View 实际上只是 POJO,对吗?如果是这样,我认为任何线程都可以毫无问题地访问它们。如果我说错了什么,请澄清。

最佳答案

出于同样的原因,集合在大多数标准库中默认是非同步的:

  1. 因为大多数时候您自然会在单线程中工作并且不想支付同步价格
  2. 同步小部件的方法是不够的,因为要自动更新两个相关的小部件,您必须先锁定它们。但如果您这样做,那么同步方法只会浪费代码和时间。

关于c# - 为什么操作 UI 控件需要在创建它的线程内完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18248587/

相关文章:

c# - 如何使用 LibGit2Sharp 从 Git 存储库中获取文件二进制数据?

c# - 如何清除内存缓存?

c# - LDAP 用户枚举不返回所有域用户

c# - 带有单词边界的正则表达式在 .NET Regex 中失败

.net - 为什么 with...do 语句和矩形不能完美地协同工作?

c# - 如何以编程方式调整图片大小并将其添加到网站

C# (Unity) 不同托管数组类型之间的快速复制

java - 在firebase数据获取方法中创建无限循环

android - 将约束 View 与数据绑定(bind)一起使用会导致错误 "Execution failed for task ' :app:mergeDebugResources'. >

android - 设置“可见性”后未获取“RelativeLayout get Height()”