我似乎无法在任何地方找到答案。我不确定我是否知道如何表达它。
发往表单控件的消息是否相互并行处理?
我一直认为我们每个线程单元都有一个消息泵,并且一个泵会为附加到该线程的整个 GUI 提供数据。因此,如果您在一个控件上连接到 wndproc 并冻结线程 (Thread.Sleep()),整个表单会冻结吗?
如果是这样,这个问题似乎证明了通过在特定消息到达子控件时休眠,相邻控件处理了它的下一条消息。如何?
我似乎无法在任何地方找到答案。我不确定我是否知道如何表达它。
发往表单控件的消息是否相互并行处理?
我一直认为我们每个线程单元都有一个消息泵,并且一个泵会为附加到该线程的整个 GUI 提供数据。因此,如果您在一个控件上连接到 wndproc 并冻结线程 (Thread.Sleep()),整个表单会冻结吗?
如果是这样,这个问题似乎证明了通过在特定消息到达子控件时休眠,相邻控件处理了它的下一条消息。如何?
消息严格按顺序处理。不要被那个 Q+A 中的时间戳误导,它只是没有足够的数字来表明消息实际上是相隔微秒到达的。消息处理程序非常快,这很正常。
只有当您有多个线程时,代码才会并行运行。这是对用户界面的毒药,大块代码永远不是线程安全的。即使是小块,非常基本的 .NET 类,如 List<> 也不是。您可以通过使用锁定、硬方法和仅使用小代码才能尝试的方式来保持代码线程安全,或者确保它始终在一个特定线程上运行。
存在消息循环是因为UI 不是线程安全的。它是生产者-消费者问题的通用解决方案。操作系统和其他进程中的线程产生,UI 线程消耗。