如果线程没有修改该元素,是否可以从另一个线程访问UI元素?

Gab*_*Roy 3 c# multithreading winforms

假设在实例化表单/ control/element(通常是主线程)的线程中运行的代码不会同时修改/访问该元素,是否可以:

  1. 获取TextBox的Text属性.

  2. 枚举ListView.

  3. 订阅Form的Closing事件.(知道将从实例化该表单的线程调用钩子)

我已经尝试了所有3并且程序似乎没有抱怨它.我一直认为你必须调用任何想要远程触摸任何UI相关(读或写)的调用.

我非常清楚为什么在修改元素时需要使用IsInvokeRequired/Invoke模式,但我不明白为什么访问属性/事件会导致任何问题.

Jam*_*mes 5

但这绝对有可能导致意外行为.此外,还需要考虑其他与线程相关的错误,例如竞争条件/死锁,请参阅托管线程最佳实践.

我总是坚持访问UI线程上的UI以保证安全.

  • @Deli在一天结束时,重要的是只有一个线程一次访问`Control`.到目前为止,执行此操作的最简单方法是只允许一个线程访问*any*控件,因为这样您就可以保证永远不会有另一个线程同时修改控件.如果您可以确保没有其他线程可以修改控件,您可以从非UI线程访问它,但由于GUI应用程序涉及的复杂性,不建议这样做. (2认同)