我知道在Windows应用程序中,后台线程不允许直接访问GUI项目。我不完全理解的是为什么。我找到的最接近的解释就是这个:
对Windows窗体控件的访问本质上不是线程安全的。如果有两个或多个线程操纵控件的状态,则可以强制控件进入不一致状态。其他与线程相关的错误也是可能的,例如竞争条件和死锁。确保以线程安全的方式访问控件非常重要。
任何人都可以详细说明两个线程可以做什么的一个特定示例,这会使窗口项处于不一致状态吗?
答案 0 :(得分:2)
Winforms和WPF不是线程安全的,因为Windows窗口不是线程安全的。一般来说,大量具有大量状态的代码从来都不是线程安全的,所以很难做到这一点。它不仅限于user32和gdi32,例如浏览器也不是线程安全的。即使微软花了很大的篇幅来保证Windows的线程安全,它在实践中仍然无法正常工作。因为这不会自动使您的代码线程安全。如果线程不协调以确定窗口应该是什么样的话,你仍然可以防止毛刺。一个非常难以解决的问题,我有伤疤来证明这一点。通用解决方案是只使一个线程负责其内容。
在Windows中,只有kernel32是线程安全的。必然如此,如果不是这样的话,你将无法安全地使用线程。你在kernel32 api函数中看到了这一点,它们会做很小的事情,影响很少的状态。