我一直在使用 C# .NET 和 Android 开发许多软件。我注意到这两个系统在 Thread
和 UI control
(Label/TextView 等)上具有相同的行为。为此,我认为防止线程外更改的设计不仅仅是巧合。
人们遇到的最普遍的问题是它们不能在创建它们的线程之外更改(例如,Text
属性)。我们必须在 C# 中使用 Invoke
,或者在 Android 中使用 Handler
。
我的问题是,为什么控件必须实现此类行为?如果我可以在创建它们的线程之外更改它们的属性/字段,可能会发生什么坏事?
编辑:感谢Raghunandanless 的引用。我已经知道其中的一部分,我对这个问题的主要关注是,为什么线程池中的线程没有在您的 UI 线程上运行无法访问控件的属性/字段? Android 的 View
实际上只是 POJO,对吗?如果是这样,我认为任何线程都可以毫无问题地访问它们。如果我说错了什么,请澄清。
最佳答案
出于同样的原因,集合在大多数标准库中默认是非同步的:
- 因为大多数时候您自然会在单线程中工作并且不想支付同步价格
- 同步小部件的方法是不够的,因为要自动更新两个相关的小部件,您必须先锁定它们。但如果您这样做,那么同步方法只会浪费代码和时间。
关于c# - 为什么操作 UI 控件需要在创建它的线程内完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18248587/