我想知道C#如何在幕后管理和发布事件。
例如,在Windows窗体应用程序中,如果我们创建一个按钮,C#是否使用轮询机制来检测按钮点击事件?
如果是这样,这次投票的频率是多少?它是在单独的线程中运行吗?
为了保持程序的响应能力,是否需要考虑最大数量的事件?
更新
在阅读答案和评论后,我了解到windows表单使用了消息。所以现在,我很难理解消息泵送是如何工作的。 根据@xanatos评论" Winforms使用Windows API方法GetMessage。 GetMessage然后返回消息队列的第一条消息,或者,如果没有消息,将线程置于等待模式,直到消息到达。"
我是编程的新手,我看不到如何将线程置于等待模式,直到消息到达。这个短语在我看来是一个while循环(或轮询)。在消息到达之前,用于将线程置于等待模式的机制是什么?
答案 0 :(得分:2)
WinForms在底层Windows API之上运行。 WinForms事件触发直接响应来自操作系统的窗口消息 - 而不是轮询。
简化说明是操作系统中的每个“窗口”都有一个关联的消息队列。操作系统将消息发送到此队列以响应用户输入,屏幕调整大小等
WinForms在应用程序的“主GUI线程”中有一个侦听这些传入消息的消息泵。收到它们后,它会创建并触发应用程序可以捕获和响应的事件,而不必处理消息泵的基础机制。
消息泵是一个有效的循环,它使线程休眠直到消息准备就绪,然后唤醒并处理消息。