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

And*_*odi 2 c# winforms

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

while(checkSomething()){
    Application.DoEvents();
}
Run Code Online (Sandbox Code Playgroud)

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

nos*_*nos 12

Application.DoEvents()检查是否有一些事件需要处理然后处理它们,然后返回.如果您checkSomething()没有阻止任何实施繁忙循环的事情.

也就是说,您的处理器正忙着运行Application.DoEvents()并且checkSomething()尽可能快.

如果您的checkSomething没有检查与其他线程相关的数据,您实际检查的是什么? - 听起来像是一个你应该处理而不是轮询的事件.


Ree*_*sey 10

当你添加这个:

while(checkSomething()){
    Application.DoEvents();
}
Run Code Online (Sandbox Code Playgroud)

你基本上是说让程序处理windows消息,尽可能快,没有任何停止它,直到"checkSomething"返回true.

有很多理由可以避免DoEvents - 如果您真的打算这样做,您应该尝试在循环中放弃一些处理时间:

while(checkSomething()){
    Application.DoEvents();
    Thread.Sleep(10); // Sleep a tiny amount... 
}
Run Code Online (Sandbox Code Playgroud)

  • @Andrea:请参阅此MSDN文章,[保持您的UI响应和Application.DoEvents的危险](http://blogs.msdn.com/b/jfoscoding/archive/2005/08/06/448560.aspx),避免"DoEvents"的更多理由.你今天没有看到问题,但是你将在六个月之后. (4认同)