事件如何在幕后工作

时间:2017-05-02 13:32:20

标签: c#

我想知道C#如何在幕后管理和发布事件。

例如,在Windows窗体应用程序中,如果我们创建一个按钮,C#是否使用轮询机制来检测按钮点击事件?

如果是这样,这次投票的频率是多少?它是在单独的线程中运行吗?

为了保持程序的响应能力,是否需要考虑最大数量的事件?

更新

在阅读答案和评论后,我了解到windows表单使用了消息。所以现在,我很难理解消息泵送是如何工作的。 根据@xanatos评论" Winforms使用Windows API方法GetMessage。 GetMessage然后返回消息队列的第一条消息,或者,如果没有消息,将线程置于等待模式,直到消息到达。"

我是编程的新手,我看不到如何将线程置于等待模式,直到消息到达。这个短语在我看来是一个while循环(或轮询)。在消息到达之前,用于将线程置于等待模式的机制是什么?

1 个答案:

答案 0 :(得分:2)

WinForms在底层Windows API之上运行。 WinForms事件触发直接响应来自操作系统的窗口消息 - 而不是轮询。

简化说明是操作系统中的每个“窗口”都有一个关联的消息队列。操作系统将消息发送到此队列以响应用户输入,屏幕调整大小等

WinForms在应用程序的“主GUI线程”中有一个侦听这些传入消息的消息泵。收到它们后,它会创建并触发应用程序可以捕获和响应的事件,而不必处理消息泵的基础机制。

消息泵是一个有效的循环,它使线程休眠直到消息准备就绪,然后唤醒并处理消息。