我似乎无法在任何地方找到这个问题的答案。我不确定我是否知道如何表达它。
发往表单控件的消息是否相互并行处理?
我的印象一直是我们每个线程单元有一个消息泵,并且一个泵将提供附加到该线程的整个 GUI。因此,如果您挂接到一个控件上的 wndproc 并卡住线程 (Thread.Sleep()),那么整个窗体都会卡住吗?
如果是,this question似乎证明,通过在特定消息到达子控件时休眠,相邻的控件会处理它的下一条消息。怎么办?
最佳答案
消息严格按顺序处理。不要被 Q+A 中的时间戳误导,它只是分数中没有足够的数字来表明消息实际上相隔微秒到达。消息处理程序非常快,这很正常。
只有当你有多个线程时,代码才会并行运行。这对用户界面来说是毒药,大块代码从来都不是线程安全的。即使是小块,非常基本的 .NET 类,如 List<> 也不是。您可以通过使用锁定来保持代码线程安全,这是一种困难的方法,您只能使用小代码才能做到这一点,或者通过确保它始终在一个特定的线程上运行。
存在消息循环是因为 UI 不是线程安全的。它是 producer-consumer problem 的通用解决方案.操作系统和其他进程中的线程产生,UI 线程消耗。
关于c# - GUI 消息队列(消息泵 - 并行或串行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33165731/