GUI消息队列(消息泵 - 并行或串行)

时间:2015-10-16 08:24:34

标签: c# winforms windows-messages message-pump

我似乎无法在任何地方找到答案。我不确定我是否知道如何表达它。

在表单进程上发送的消息是否相互并行?

我总是觉得我们每个线程公寓有一个消息泵,并且一个泵将提供连接到该线程的整个GUI。所以,如果你在一个控件上挂钩wndproc并冻结线程(Thread.Sleep()),整个表单会冻结吗?

如果是这样,this question似乎证明通过在特定消息到达子控件时休眠,相邻控件处理其下一条消息。怎么样?

1 个答案:

答案 0 :(得分:3)

严格按顺序处理邮件。不要被Q + A中的时间戳误导,它只是在分数中没有足够的数字来表示消息实际上以微秒的速度到达。消息处理程序非常快,这是正常的。

当您有多个线程时,代码只能并行运行。这对用户界面是有害的,大块代码永远不会是线程安全的。即使是小块,非常基本的.NET类,如List<>不是。你可以通过使用锁定来保持代码线程安全,这是一种难以实现的方法,只需要使用小代码,或者确保它始终在一个特定的线程上运行。

消息循环存在,因为 UI不是线程安全的。它是producer-consumer problem的通用解决方案。操作系统中的线程和其他进程产生,UI线程消耗。