我的表单应用程序上有几个 System.Threading.Timers,它们具有可以成功更新 UI 的回调 - 即不会引发错误。
在我知道 UI 不应该在 UI 线程以外的任何线程上更新之前,我就已经构建了这些。
现在我很困惑为什么当我在这些单独的 threading.timer 线程上更新 UI 时它不会抛出跨线程异常?
我将更改这些回调,以便在 UI 线程上调用 UI 更新,但我很好奇为什么会这样。
编辑:我的应用程序是 WinForms 应用程序。
最佳答案
I will be changing these callbacks so that the UI updates are invoked on UI thread, but I am curious as to why this works.
如果这是 Windows 窗体,那么它的工作纯粹是运气。在后台线程上更新 UI 并不总是有效,但偶尔也不会抛出异常。特别是,如果 CheckForIllegalCrossThreadCalls是假的,它有时会“工作”,并且永远不会抛出 - 尽管行为通常是错误的。某些控件并不总是检查每个属性,因此某些项目即使并不总是正常工作,也会“工作”,因为这通常会引入稍后难以诊断和纠正的错误。
旁注:如果这是 WPF,您可以在后台线程上更改绑定(bind)到 UI 的项目的值,从而有效地更新您的 UI。 WPF 绑定(bind)系统会自动为您将其编码到 UI 线程。但是,更改集合的一部分是行不通的。
关于c# - 为什么 System.Threading.Timer 回调成功更新 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10884752/