0

我知道在 Windows 应用程序后台线程不允许直接访问 GUI 项。我不完全明白为什么。我找到的最接近的解释是这个:

对 Windows 窗体控件的访问本质上不是线程安全的。如果您有两个或更多线程操作控件的状态,则可能会强制控件进入不一致的状态。其他与线程相关的错误是可能的,例如竞争条件和死锁。确保以线程安全的方式执行对控件的访问非常重要。

这是来自这个 MS 文档

任何人都可以详细说明两个线程可以做什么会使窗口项进入不一致状态的具体示例吗?

4

1 回答 1

2

Winforms 和 WPF 不是线程安全的,因为 Windows 窗口不是线程安全的。通常,具有大量状态的大量代码永远不是线程安全的,要做到这一点太难了。它不仅限于 user32 和 gdi32,例如浏览器也不是线程安全的。即使微软竭尽全力使 Windows 线程安全,它在实践中仍然不能很好地工作。因为这不会自动使您的代码线程安全。如果线程不协调以确定窗口的外观,您仍然会遇到故障。一个很难解决的问题,我有伤疤来证明它。通用的解决方案是只让一个线程负责其内容。

在 Windows 中,只有 kernel32 是线程安全的。必然如此,如果不是这种情况,您将无法安全地使用线程。你在 kernel32 api 函数中看到了这一点,它们做的事情非常小,影响非常小的状态。

于 2013-04-15T19:10:52.567 回答