为什么Application.DoEvents使cpu使用率提高到100%

时间:2010-09-20 20:57:52

标签: c# winforms

我经常在winforms应用程序中使用此代码来等待事件,而不使用线程。

while(checkSomething()){
    Application.DoEvents();
}

程序和PC在循环运行时仍然响应,但是如果我在任务managart中查看cpu使用情况,则使用率报告为100%。 你知道为什么会这样吗?

5 个答案:

答案 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)

因为......无论它做什么,它都不停?