我经常在winforms应用程序中使用此代码来等待事件,而不使用线程。
while(checkSomething()){
Application.DoEvents();
}
程序和PC在循环运行时仍然响应,但是如果我在任务managart中查看cpu使用情况,则使用率报告为100%。 你知道为什么会这样吗?
答案 0 :(得分:12)
Application.DoEvents()检查是否有某些事件需要处理,然后处理它们,然后返回。如果您的checkSomething()
没有阻止您实施繁忙循环的任何内容。
也就是说,您的处理器正在尽快运行Application.DoEvents()
和checkSomething()
。
如果您的checkSomething没有检查与其他线程相关的数据,您实际检查的是什么? - 听起来像是你应该处理的事件而不是轮询。
答案 1 :(得分:10)
添加时:
while(checkSomething()){
Application.DoEvents();
}
你基本上是说让程序处理windows消息,尽可能快,没有任何东西停止它,直到“checkSomething”返回true。
有很多reasons to avoid DoEvents
- 有人说,如果你真的打算这样做,你应该试着在你的循环中放弃一些处理时间:
while(checkSomething()){
Application.DoEvents();
Thread.Sleep(10); // Sleep a tiny amount...
}
答案 2 :(得分:1)
如果您的checkSomething()
来电始终为真,那么您正在进行所谓的“忙碌等待”。 CPU正在运行checkSomething()
电话。当它评估为true
时,您将保持循环,处理事件,并重新执行。
答案 3 :(得分:1)
Application.DoEvents非常危险。我曾经称之为使我的WinForms应用程序的UI响应,但是你可以使用BackgroundWorker轻松地响应UI,你将避免InvokeRequired开销。
答案 4 :(得分:0)
因为......无论它做什么,它都不停?