为什么操作UI控件需要在创建它的线程内完成
本文关键字:线程 创建 UI 操作 控件 为什么 | 更新日期: 2023-09-27 18:27:50
我一直在使用C#和Android开发许多软件。我注意到两个系统在Thread
和UI control
(Label/TextView等)上有相同的行为。因此,我认为设计防止线程外的更改并不完全一致。
人们遇到的最常见的问题是,不能在创建的线程之外更改它们(比如Text
属性)。我们必须在C#中使用Invoke
,或者在Android中使用Handler
。
我的问题是,为什么控制必须实施这种行为?如果我可以在创建它们的线程之外更改它们的属性/字段,会发生什么糟糕的情况?
编辑:感谢Raghunandanless的推荐。我已经知道了其中的部分内容,我对这个问题的主要担忧是,为什么线程池中的线程没有在您的UI线程上运行无法访问控件的属性/字段?安卓的View
实际上只是POJO,我说得对吗?如果是这样的话,我认为任何线程都可以毫无问题地访问它们。如果我说错了什么,请澄清。
出于同样的原因,在大多数标准库中,默认情况下集合是不同步的:
- 因为大多数时候,您自然地在单线程中工作,而不需要支付同步的代价
- 仅仅同步小部件的方法是不够的,因为要原子地更新两个相关的小部件,必须首先锁定这两个小部件。但如果你这样做,那么同步的方法只是浪费代码和时间