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

标签 c# winforms windows-messages message-pump

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

发往表单控件的消息是否相互并行处理?

我的印象一直是我们每个线程单元有一个消息泵,并且一个泵将提供附加到该线程的整个 GUI。因此,如果您挂接到一个控件上的 wndproc 并卡住线程 (Thread.Sleep()),那么整个窗体都会卡住吗?

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

最佳答案

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

只有当你有多个线程时,代码才会并行运行。这对用户界面来说是毒药,大块代码从来都不是线程安全的。即使是小块,非常基本的 .NET 类,如 List<> 也不是。您可以通过使用锁定来保持代码线程安全,这是一种困难的方法,您只能使用小代码才能做到这一点,或者通过确保它始终在一个特定的线程上运行。

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

关于c# - GUI 消息队列(消息泵 - 并行或串行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33165731/

相关文章:

vb.net - Windows Form VB.Net-附加用于部署的空目录

.net - 在 .NET 中创建 SCADA 图

c# - 按钮的继承

c# - 使用 EPPlus 检查文件是否实际上是 Excel 文件

c# - 返回 IQueryable 表达式而不执行数据库查询

c# - 如何获取 Controller 名称和基本 Controller 中可用的数据?

windows - Delphi:自定义窗口菜单:需要 Msg.CmdType 和 $FFF0 说明

c++ - 如何在 CWinApp 中获取 WM_POWERBROADCAST 消息?

c# - Windows Vista 及更高版本的任务栏右键单击应用程序上下文菜单

c# - 具有多个结果集的 Entity Framework 5 存储过程