让我们假设在实例化窗体/控件/元素(通常是主线程)不修改/在同一时间访问该元素的线程中运行的代码,是有可能:如果线程不修改该元素,是否可以从另一个线程访问UI元素?
GET TextBox的Text属性。
枚举ListView。
订阅Form's Closing事件。 (知道挂钩将从实例化该窗体的线程调用)
我试过所有3,程序似乎没有抱怨它。我一直认为你必须调用任何想要甚至远程触摸与UI有关的任何调用(读或写)。
我非常清楚为什么我需要在修改元素时使用IsInvokeRequired/Invoke模式,但是我不明白为什么访问属性/事件会导致任何问题。
因此,基本上,即使我遵循每一个线程最佳实践,仍然可能会出现一些无证的奇怪现象吗? –
那么通过不在UI线程上访问UI组件,您的*不*遵循最佳实践。如果你开始讨论跨线程访问,它肯定会在某个时候炸毁你的脸,但不一定就是这样。 – James
@Deli在一天结束时,所有重要的事情是一次只有一个线程访问一个'Control'。到目前为止,最简单的方法是只允许一个线程访问* any *控件,因为这样可以保证永远不会有另一个线程同时修改控件。如果您可以确保没有其他线程正在修改控件,您可以从非UI线程访问它,但由于GUI应用程序中涉及的复杂性,不建议这样做。 – Servy