C#中Application.DoEvents()
Application.DoEvents()
Application
// // 摘要: // 提供 static 方法和属性以管理应用程序,例如启动和停止应用程序、处理 Windows 消息的方法和获取应用程序信息的属性。无法继承此类。 public sealed class Application
DoEvents()
// // 摘要: // 处理当前在消息队列中的所有 Windows 消息。 public static void DoEvents()
处理当前在消息队列中的所有 Windows 消息。
交出CPU控制权,让系统可以处理队列中的所有Windows消息 ,比如在大运算量循环内,加Application.DoEvents可以防止界面停止响应。
因为winform的消息循环是一个线程来处理,那么假如你的某个操作比较耗时,那么消息处理得等你这个耗时操作做完了才能继续,而Application.DoEvents方法就是允许你在耗时操作的内部调用它
而去处理消息队列中的消息。
像鼠标移动鼠标点击都是windows消息,如果耗时操作一直进行,那么界面就像死锁一样。
使用Application.DoEvents()是为了在加载大量数据时能够有一个数据加载的提示,不至于系统出现假死的现象
例如:当我点击按钮button3时,线程就进入了无尽的for循环中,直到循环结束。在这循环的期间,你不能对窗口进行任何的操作(窗口进入一种假死的状态,不能移动窗口等其他操作),而且button3的text最终只显示99999999,并不会依次显示1,2,3.....99999
private void button3_Click(object sender, EventArgs e) { for (int i = 0; i < 10000000; i++) { button3.Text = i.ToString(); } }
又例如,加上Application.DoEvents之后,最明显的变化就是button3的text会依次显示1,2,3.....99999,简单的理解就是:每一次Application.DoEvents()循环之后,就交出CPU的控制权,然后button3.Text的值就有时间可以变成i.ToString(),然后再循环,再变,直到循环结束
private void button3_Click(object sender, EventArgs e) { for (int i = 0; i < 10000000; i++) { button3.Text = i.ToString(); Application.DoEvents(); } }
但是好处有了,缺点也是有的
1、速度慢。
2、存在"bug"。循环的过程中,点击窗口或者做其他操作,会导致循环暂停(其实也很好理解,这个东西实际也是在同一个线程上操作的,你点击窗口把线程占用了,那么循环就只能暂停咯~),直到不占用线程,循环继续。
执行耗时对比:
从较大数据的循环中可以看出效率是很低的,所以如果能不调用DoEvents就尽量不用。也可以通过别的方法来处理的,例如多线程异步调用等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix