【发布时间】:2016-11-18 09:18:21
【问题描述】:
我很困惑 winforms 中的消息循环是如何工作的。我正在处理 Windows 表单,我知道何时调用 Application.Run(myform),因此它将创建一个消息队列和消息循环,然后显示我的表单并开始在消息队列中检索消息以进行调度。
我阅读了一些主题,但仍然不明白消息循环在幕后是如何工作的,UI Thread both running message pump AND executing code? 和 How does the message loop use threads?
我的问题是:消息循环是否会在 UI 线程上运行。如果是,为什么它不阻塞 UI 线程?
如果问题不清楚,请告诉我,对不起,因为我的英语不好。
【问题讨论】:
-
这是在 Delphi 的上下文中编写的,但是您可以将
ProcessMessages替换为DoEvents其余部分相同:stackoverflow.com/a/25182276/327083 -
请注意 - 消息队列已经存在。
Application.Run的主要作用是启动消息循环。这实际上只是一个从队列中获取消息并处理它们的几乎无穷无尽的循环。消息循环不是完全 UI 线程,但在 99% 的情况下,您可以将它们视为相同的东西。所有这些 UI 操作(例如单击按钮)都作为消息发送到队列,在循环中执行并在您的代码中进行处理。这是因为 Windows 窗口系统是基于消息/事件的 - UI 线程不会主动轮询输入状态,它会等待消息。 -
"消息循环是否会在 UI 线程上运行。如果是,为什么它不阻塞 UI 线程?"消息循环是 UI 线程,所以这个问题在这种情况下没有任何意义。
-
@Richard Everett,对不起,我在发布此主题之前阅读了该主题,它真的很短,我不明白这一点。实际上我需要更多解释!
标签: c# winforms message-queue messages