Почему Application.DoEvents увеличивает использование процессора до 100% - PullRequest
2 голосов
/ 21 сентября 2010

Я часто использую этот код в приложениях winforms для ожидания событий, без использования потоков.

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

Программа и компьютер по-прежнему реагируют во время выполнения цикла, однако, если я посмотрю использование процессора в диспетчере задач, оно будет отображаться как 100%. Вы знаете, почему это происходит?

Ответы [ 5 ]

12 голосов
/ 21 сентября 2010

Application.DoEvents () проверяет, есть ли какие-то события, которые необходимо обработать, а затем обрабатывает их и возвращает.Если ваш checkSomething() не блокирует что-либо, вы реализовали цикл занятости.

То есть ваш процессор занят выполнением Application.DoEvents() и checkSomething() так быстро, как только может.

Если ваш checkSomething не проверяет данные, связанные с другими потоками, что вы на самом деле проверяете?- звучит так, как будто есть событие, которое вы должны обрабатывать вместо опроса.

10 голосов
/ 21 сентября 2010

Когда вы добавите это:

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

Вы говорите, что программа обрабатывает сообщения Windows как можно быстрее, без остановки, пока "checkSomething" не вернет true.

Существует множество причин, по которым следует избегать DoEvents - при этом, как говорится, если вы действительно планируете это сделать, вы должны попытаться сократить время обработки в цикле:

while(checkSomething()){
    Application.DoEvents();
    Thread.Sleep(10); // Sleep a tiny amount... 
}
1 голос
/ 21 сентября 2010

Приложение. DoEvents очень опасно. Раньше я вызывал его, чтобы сделать пользовательский интерфейс моего приложения WinForms отзывчивым, однако вы можете использовать BackgroundWorker, чтобы сделать пользовательский интерфейс очень удобным и избежать издержек InvokeRequired.

1 голос
/ 21 сентября 2010

Потому что вы делаете то, что называется «ожиданием занятости», если ваш checkSomething() вызов возвращает true все время.Процессор выполняет ваш checkSomething() вызов.Пока он оценивается как true, вы будете оставаться в цикле, обрабатывать события и делать все заново.

0 голосов
/ 21 сентября 2010

потому что ... что бы это ни было, оно работает без остановки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...