winforms - 在 WinForms 中,为什么不能从其他线程更新 UI 控件?

标签 winforms multithreading

我确信这有一个很好的(或至少体面的)理由。它是什么?

最佳答案

I think this is a brilliant question - and I think there is need of a better answer.

Surely the only reason is that there is something in a framework somewhere that isn't very thread-safe.



这个“东西”几乎是 System.Windows.Forms 中每个控件上的每个实例成员。

System.Windows.Forms 中许多控件的 MSDN 文档(如果不是全部)说“这种类型的任何公共(public)静态(在 Visual Basic 中共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。”

这意味着实例成员如 TextBox.Text {get; set;}不是 可重入 .

使这些实例成员中的每一个都成为线程安全的可能会引入大多数应用程序不需要的大量开销。相反,.Net 框架的设计者决定,而且我认为是正确的,应该把从多个线程同步访问表单控件的负担放在程序员身上。

[编辑]

虽然这个问题只问“为什么”,但这里有一个解释“如何”的文章的链接:

如何:对 MSDN 上的 Windows 窗体控件进行线程安全调用

http://msdn.microsoft.com/en-us/library/ms171728.aspx

关于winforms - 在 WinForms 中,为什么不能从其他线程更新 UI 控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10349/

相关文章:

c# - 按钮双击事件

c# - 单击事件未触发 - 无法更改焦点 - 无法关闭表单

C# Winform 图表,x 轴显示日期和时间的缩放和刻度

c++ - 原子商店。结构

java执行器框架

C# lock语句,锁定什么对象?

java - 如何为 android 3D 游戏框架创建更新方法?

c# - 如何删除时间并仅在 RDLC 中显示日期

windows - 如何检测我的应用程序是最顶层的窗口

c# - 向等待 TCP 的线程发送指令?