c# - 为什么 System.Threading.Timer 回调成功更新 UI?

标签 c# winforms multithreading thread-safety

我的表单应用程序上有几个 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/

相关文章:

c# - Winforms 位置

c# - 应用程序很少在 Debug模式下完成加载,但 "run without debug"加载正常

c# - 当 Ping 往返时间超过 50 毫秒时,如何更改 PictureBox 的图像?

java - Java中的BufferedReader在尝试从关闭的套接字读取时无法触发异常

c# - 使用 Google Calendar API 添加和检索扩展属性

c# - 如何删除对象而不在 EF 中检索它

.net - 寻找.NET "text"编辑器控件

java - 从线程中释放资源

multithreading - std::thread 的作用域线程包装器

c# - 我如何使用 linq 并从数据表中选择值总和(字段)以及 where 子句?